Jam*_*ack 1 c c++ gcc makefile zlib
这是错误代码段
/home/jamesblack/Development/v2server/svr_tick.c:1309: undefined reference to `deflateEnd'
Run Code Online (Sandbox Code Playgroud)
当我运行我的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
Run Code Online (Sandbox Code Playgroud)
然后它喷出很多类似的错误,我用Google搜索的所有内容都提到安装zlib并将其与-lz链接,这显然是在make命令中,我也很确定我安装正确.apt-get install zlib1g-dev在ubuntu 11 64bit中
有什么想法吗
编辑:
位于/usr/local/zlib/include/zlib.h的我的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).
*/
Run Code Online (Sandbox Code Playgroud)
这是我需要的吗?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
Run Code Online (Sandbox Code Playgroud)
将库放在目标文件之后,因此修改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
Run Code Online (Sandbox Code Playgroud)
它应该是这样的:
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
Run Code Online (Sandbox Code Playgroud)
如果至少有一个符号满足未完成的未定义引用,则链接器仅从共享库中提取符号; 当库首先出现时,它们通常没有main(),这就是链接器要求的开头.(这是行为的改变;几年前,链接器倾向于引入每个共享库,无论它是否满足任何未定义的符号.)