无法使用 GCC 构建 C 应用程序,因为未定义对'deflateEnd'的引用
Cannot Build C Application with GCC because of undefined reference to 'deflateEnd'
这是错误片段
/home/jamesblack/Development/v2server/svr_tick.c:1309: undefined reference to `deflateEnd'
当我运行我的 makefile 时会发生这种情况,看起来它运行此命令。
gcc -O -g -lm -lz -lcrypt -o server .obj/server.o .obj/svr_disk.o .obj/svr_tick.o .obj/svr_act.o .obj/driver.o .obj/svr_god.o .obj/svr_do.o .obj/svr_glob.o .obj/build.o .obj/use_driver.o .obj/look_driver.o .obj/svr_effect.o .obj/driver_etc.o .obj/driver_generic.o .obj/populate.o .obj/helper.o .obj/skill.o .obj/skill_driver.o .obj/talk.o .obj/area.o .obj/path.o .obj/stunrun.o .obj/cityattack.o .obj/npc_malte.o .obj/lab9.o .obj/rdtsc.o .obj/ccp_driver.o
然后它喷出很多类似的错误,我用谷歌搜索过的所有内容都提到安装 zlib 并将其与 -lz 链接,这显然在 make 命令中,我也非常确定我安装正确。 apt-get 在 ubuntu 11 中安装 zlib1g-dev 64 位
任何想法
编辑:
我的 zlib.h 位于/usr/local/zlib/include/zlib.h 包括这个
ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
/*
All dynamically allocated data structures for this stream are freed.
This function discards any unprocessed input and does not flush any pending
output.
deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
stream state was inconsistent, Z_DATA_ERROR if the stream was freed
prematurely (some input or output was discarded). In the error case, msg
may be set but then points to a static string (which must not be
deallocated).
*/
这是我需要它拥有的吗?此外,echo $LD_LIBRARY_PATH 不返回任何内容。我真的让 Zlib 配置正确吗?
编辑2:
gcc -I/usr/local/zlib/include -O -g -lm -lz -lcrypt -o server .obj/server.o .obj/svr_disk.o .obj/svr_tick.o .obj/svr_act.o .obj/driver.o .obj/svr_god.o .obj/svr_do.o .obj/svr_glob.o .obj/build.o .obj/use_driver.o .obj/look_driver.o .obj/svr_effect.o .obj/driver_etc.o .obj/driver_generic.o .obj/populate.o .obj/helper.o .obj/skill.o .obj/skill_driver.o .obj/talk.o .obj/area.o .obj/path.o .obj/stunrun.o .obj/cityattack.o .obj/npc_malte.o .obj/lab9.o .obj/rdtsc.o .obj/ccp_driver.o
将库放在目标文件之后,因此修改 makefile 或重写 link 命令,以便而不是像这样(如问题中):
gcc -O -g -lm -lz -lcrypt -o server .obj/server.o .obj/svr_disk.o .obj/svr_tick.o
.obj/svr_act.o .obj/driver.o .obj/svr_god.o .obj/svr_do.o .obj/svr_glob.o
.obj/build.o .obj/use_driver.o .obj/look_driver.o .obj/svr_effect.o
.obj/driver_etc.o .obj/driver_generic.o .obj/populate.o .obj/helper.o
.obj/skill.o .obj/skill_driver.o .obj/talk.o .obj/area.o .obj/path.o
.obj/stunrun.o .obj/cityattack.o .obj/npc_malte.o .obj/lab9.o
.obj/rdtsc.o .obj/ccp_driver.o
它应该是这样的:
gcc -O -g -o server .obj/server.o .obj/svr_disk.o .obj/svr_tick.o .obj/svr_act.o
.obj/driver.o .obj/svr_god.o .obj/svr_do.o .obj/svr_glob.o .obj/build.o
.obj/use_driver.o .obj/look_driver.o .obj/svr_effect.o .obj/driver_etc.o
.obj/driver_generic.o .obj/populate.o .obj/helper.o .obj/skill.o
.obj/skill_driver.o .obj/talk.o .obj/area.o .obj/path.o .obj/stunrun.o
.obj/cityattack.o .obj/npc_malte.o .obj/lab9.o .obj/rdtsc.o .obj/ccp_driver.o
-lm -lz -lcrypt
仅当至少有一个符号满足未定义的未定义引用时,链接器才会从共享库中提取符号;当库首先出现时,它们通常没有main()
,这就是链接器首先要查找的内容。 (这是行为的改变;几年前,链接器倾向于拉入每个共享库,而不管它是否满足任何未定义的符号。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用