【问题标题】:c -lz library link order (undefined reference to symbol "inflateInit2_")c -lz 库链接顺序(未定义对符号“inflateInit2_”的引用)
【发布时间】:2015-05-25 18:50:54
【问题描述】:

我按这个顺序链接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 放在哪里?

【问题讨论】:

  • 你试过把-lz放在最后而不是第一个吗?
  • /usr/local/include 中不应有任何库(通常“include”目录用于源代码中#include 语句的编译步骤,而不是用于链接步骤)

标签: c static-linking c-libraries


【解决方案1】:

对于 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))。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 2023-03-20
    • 1970-01-01
    • 2018-12-07
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2014-09-13
    相关资源
    最近更新 更多