1

我按此顺序链接 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_"

我想知道是否是图书馆链接顺序问题?我应该把-lz放在哪里?

4

1 回答 1

1

对于 GCC 和 Clang(也可能是 Intel 编译器),规则是命令行中较早的引用由命令行中稍后指定的库满足。

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

$ gcc foo.c -lbar

,并且编译不正确

$ gcc -lbar foo.c

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

gcc(1)这是手册页(-l选项)中的相关引用:

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,在文件foo.o之后但在bar.ofoo.o -lz bar.o之前搜索库z。如果bar.o引用z中的函数,则可能不会加载这些函数。

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

于 2015-03-22T20:17:27.847 回答