【问题标题】:Linking the static version of a library instead of the dynamic one链接库的静态版本而不是动态版本
【发布时间】:2011-09-22 09:32:29
【问题描述】:

我正在尝试在我的应用程序中使用libjpeg。制作项目会在 .libs 文件夹中生成一个 libjpeg.a。我想做的是在链接阶段使用这个文件。我尝试了以下方法:我将 libjpeg.a 复制到了我的 C 代码所在的文件夹中。尝试链接

gcc libjpeg.a mycode.c -o executable_name

失败。如果我执行 gcc -ljpeg mycode.c,当我将标题更改为指向而不是“libjpeg.h”时,编译成功,但这显然链接到库的系统范围动态版本。

尝试使用相对或绝对路径链接也会失败:

gcc ./libjpeg.a mycode.c -o executable_name

我也尝试过静态选项:

gcc -static libjpeg.a mycode.c -o executable_name

链接器错误如下:

Linking...
gcc -std=c99 -Wall -Wextra -g -pedantic ./libjpeg.a ./libjpeg.a -lm obj/read_jpeg.o obj/utils.o -o test_jpeg
obj/read_jpeg.o: In function `read_JPEG_file':
/home/ustun/Downloads/jpeg_test/read_jpeg.c:37: undefined reference to `jpeg_std_error'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:45: undefined reference to `jpeg_CreateDecompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:46: undefined reference to `jpeg_stdio_src'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:47: undefined reference to `jpeg_read_header'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:48: undefined reference to `jpeg_start_decompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:62: undefined reference to `jpeg_read_scanlines'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:74: undefined reference to `jpeg_finish_decompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:75: undefined reference to `jpeg_destroy_decompress'
obj/read_jpeg.o: In function `read_JPEG_file_props':
/home/ustun/Downloads/jpeg_test/read_jpeg.c:93: undefined reference to `jpeg_std_error'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:100: undefined reference to `jpeg_CreateDecompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:101: undefined reference to `jpeg_stdio_src'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:102: undefined reference to `jpeg_read_header'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:103: undefined reference to `jpeg_start_decompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:113: undefined reference to `jpeg_read_scanlines'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:116: undefined reference to `jpeg_finish_decompress'
/home/ustun/Downloads/jpeg_test/read_jpeg.c:117: undefined reference to `jpeg_destroy_decompress'
collect2: ld returned 1 exit status
make: *** [test_jpeg] Error 1

您可以使用 Makefile here 下载一个简单的项目。

【问题讨论】:

    标签: gcc libjpeg


    【解决方案1】:

    您必须提供libjpeg.a 的完整路径,如果您在相对于编译位置的 .libs 文件夹中有 libjpeg.a:

    gcc  mycode.c -o executable_name .libs/libjpeg.a
    

    如果您的特殊 libjpeg.a 在其他地方,请给出它的完整路径。

    如果失败,您必须告诉我们会发生什么。 (细节很重要,所以请复制粘贴确切的错误和运行的确切命令行)。

    【讨论】:

    • 谢谢。这似乎是正确的轨道,但我仍然遇到链接错误。 Libjpeg 还创建了一个 .la 文件,也许我也需要链接它?
    • 我认为这确实做到了!图书馆需要在最后。我可能会再看一下并接受这一点。
    • 我同意 nos 的回答。请记住,链接器参数对它们的调用顺序非常敏感(通常:对象只能在链接器行的右侧找到它们链接的函数,而不是在左侧)。当 .la 对象在游戏中时,这些是 libtool 对象,您可以使用 libtool 链接到它们或在 .libs 中找到真实的对象。
    • "对象只能在链接器行的右侧找到它们链接到的函数,而不是在左侧)" 哦,这太令人惊讶了!我认为这正好相反,首先给出库,然后是使用它的文件。我还记得读过现代编译器中的顺序并不重要,但在这种情况下似乎很重要。
    • 这对静态(.a)库很重要。它们必须以命令行上依赖项的相反顺序指定。使用 shared(.so) 库,顺序无关紧要。
    【解决方案2】:

    你需要使用-static:

    gcc -static -o exec_name mycode.c -ljpeg
    

    无需复制存档 (.a)。你可以通过阅读 man ld 来发现。

    【讨论】:

    • 我正在尝试链接到我的特定版本的 libjpeg.a,而不是系统范围的。
    • 那么您必须向我们提供您的方法失败的链接器错误。
    • 谢谢,我已经包含了链接器错误,但它似乎并没有说太多。如果您想看一下,我已经包含了一个示例项目。谢谢。
    【解决方案3】:

    如果您遇到与我相同的问题,这可能会对您有所帮助。在我的系统中,我有

    libjpeg.so.62 -> libjpeg.so.62.0.0 libjpeg.so.62.0.0

    添加符号链接后:

    sudo ln -s libjpeg.so.62 libjpeg.so

    我的问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多