无法使用 GCC 构建 C 应用程序,因为未定义对'deflateEnd'的引用

Cannot Build C Application with GCC because of undefined reference to 'deflateEnd'

本文关键字:未定义 引用 因为 deflateEnd GCC 构建 应用程序      更新时间:2023-10-16

这是错误片段

/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(),这就是链接器首先要查找的内容。 (这是行为的改变;几年前,链接器倾向于拉入每个共享库,而不管它是否满足任何未定义的符号。