1

ここにエラースニペットがあります

/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 64ビットにzlib1g-devをインストールします

何かご意見は

編集:

/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).
*/

これは私が持っている必要があるものですか?また、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 
4

1 に答える 1

5

オブジェクト ファイルの後にライブラリを配置するため、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  

次のようになります。

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

リンカーは、シンボルの少なくとも 1 つが未定義の未定義の参照を満たす場合にのみ、共有ライブラリからシンボルを取得します。ライブラリが最初に来るとき、通常はライブラリがなく、それがmain()リンカが最初に探しているものです。(これは動作の変更です。数年前、リンカーは、未定義のシンボルを満たしているかどうかに関係なく、すべての共有ライブラリを取り込む傾向がありました。)

于 2012-09-29T05:48:58.487 に答える