【问题标题】:Linking a specific library with gcc使用 gcc 链接特定库
【发布时间】:2017-11-17 19:37:23
【问题描述】:

这可能是一个基本问题,但是如何找到需要与 gcc 链接的库?我正在尝试编译一个使用 #include <signal.h> 的共享库,但是当我尝试使用它时,它给了我一个 CANNOT LINK EXECUTABLE 因为它找不到任何符号。 我假设我必须在 gcc 中使用标志 -l 专门链接库,但我不知道该库在哪里/是什么。

在更广泛的示例中,-ldl 链接到 libdl.so,我可以使用什么 -l 链接到 #include <signal.h>

编辑:

soinfo_link_image(linker.cpp:1617): could not load library "mylib.so" needed by "/bin/test";
cause by soinfo_relocate(linker.cpp:975): cannot locate symbol "signal" referenced by "mylib.so"...CANNOT LINK EXECUTABLE  

编译使用:

gcc -fPIC -c -g -o mylib.o mylib.c  
gcc -shared -o mylib.so mylib.o -ldl

【问题讨论】:

  • 执行一个库?
  • 没有适用于所有情况的过程,因为库的名称与其标题名称没有系统关系。有些工具可以在某些情况下提供帮助,例如pkg-config,但必须对库进行编码以支持它们。在signal.h 的特定情况下,您根本不需要任何特殊的-l 开关;您的问题是由其他原因引起的,或者您的 C 库已损坏。为了让我们帮助您了解实际情况,请将您收到的错误消息的完整且未经编辑的文本复制并粘贴到您的问题中。
  • 您遇到了一些错误?难道这些错误消息的内容至少与问题有点相关?!
  • <signal.h> 标头中的函数通常可以在与您的程序自动链接的标准 C 库中找到。因此,您看到的错误是意料之外的。是gcc -shared 命令行导致了问题,还是当您在另一个程序中使用该库时?用于创建其他程序的命令序列是什么?谁写了soinfo_link_image()linker.cpp 在哪里?那是一个 C++ 文件;是否需要链接 C++ 编译器(g++ 而不是gcc)?
  • 当我尝试从另一个程序调用库时发生错误。不幸的是我没有创建其他程序,所以我不知道命令序列。另外我不知道linker.cpp在哪里,我正在使用交叉编译工具链来交叉编译arm处理器。

标签: c gcc linker


【解决方案1】:

这更像是一个链接器问题而不是 GCC 问题。通常,库文档中会提到库名称。在 GNU/Linux 发行版上,许多库都有用于 pkg-config.pc 文件。如果没有,您可以使用诸如

之类的命令
dpkg -S /usr/include/signal.h

rpm -qf /usr/include/signal.h

找到提供头文件的-dev/-devel包,然后继续查看

dpkg -L libc6-dev

rpm -ql glibc-devel

输出以确定用于链接的.so 文件的名称。可以使用objdump -Tnm -Dgeu-readelf --symbols=.dynsym(有很多选择)查看定义的符号。

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2011-03-24
    • 2010-10-18
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2020-09-01
    相关资源
    最近更新 更多