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))。
我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))。