c -lz library link 命令(未定义符号引用 "inflateInit2_")

c -lz library link order (undefined reference to symbol "inflateInit2_")

我link CodeBlocks中的库按这个顺序,

-lz
-L/usr/local/lib
-L/usr/local/include
-pthread
-lswscale
-lavutil
-lavcodec
-lmp3lame
-lopus
-ltiff
-lvorbis
-ltheora
-ltheoraenc
-ltheoradec
-lvorbisenc
-ltiffxx
-llzma
-lva
-lavfilter
-lavformat
-lfreetype

仍然有错误:

undefined reference to symbol "inflateInit2_"

请问是不是图书馆link顺序问题? 我应该把 -lz 放在哪里?

对于 GCC 和 Clang(可能还有 Intel 编译器),规则是命令行中前面指定的库满足命令行中后面指定的引用。

例如,如果foo.c引用库bar中的函数,那么用[=20编译是正确的=]

$ gcc foo.c -lbar

,用

编译不正确
$ gcc -lbar foo.c

因此,最安全的做法是将 -lz 放在最后,这样它就可以满足前面指定的所有库的引用。

这是来自 gcc(1) 手册页(-l 选项)的相关引述:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.

然而,更好的方法可能是使用例如pkg-config(1)--libs 以获得特定库所需的标志。一些库还附带用于此目的的自定义脚本(例如,sdl(2)-config 用于 SDL(2))。