我按照这个顺序链接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放在哪里?
答案 0 :(得分:0)
对于GCC和Clang(也可能是英特尔编译器),规则是在命令行中稍后在命令行中指定的库中满足以前对命令行的引用。
例如,如果 foo.c 引用库 bar 中的函数,则使用
进行编译是正确的。$ gcc foo.c -lbar
,用
编译不正确$ gcc -lbar foo.c
因此,您最安全的选择是将-lz
放在最后,以便它可以满足前面指定的所有库的引用。
以下是gcc(1)
手册页(-l
选项)的相关引用:
在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,
foo.o -lz bar.o
在文件 foo.o 之后但在 bar.o 之前搜索库 z 。如果 bar.o 引用 z 中的函数,则可能无法加载这些函数。
然而,更好的是使用例如使用pkg-config(1)
--libs
获取特定库所需的标记。一些库还附带了用于此目的的自定义脚本(例如,sdl(2)-config
用于SDL(2))。