【问题标题】:Linking shared libraries with gcc on Linux在 Linux 上使用 gcc 链接共享库
【发布时间】:2025-11-29 14:20:05
【问题描述】:

我需要编译,最重要的是,链接一个C 程序,该程序使用共享库文件中的专有function。由于与之前的开发团队缺乏沟通,因此没有适当的文档。我声明了一个函数原型(因为我知道参数的数量和类型):

int CustomFunction(unsigned char *in, int size);

由于可以从/customlibs/libcustom.so 中获取该函数名称,因此我尝试编译代码并将其链接如下:

gcc -L/customlibs testing.c -o testing -lcustom

这会引发一些如下所示的错误消息:

/customlibs/libcustom.so: undefined reference to `AnotherCustomFunction'

显然,我需要告诉链接器也包含其他库,而且更糟糕的是,它们需要按特定顺序排列。我尝试使用-Wl,-rpath=-Wl,--no-undefined-Wl,--start-group 导出LD_LIBRARY_PATH。有没有一种简单的方法可以在没有正确顺序的情况下为链接器提供所有 .so 文件?

【问题讨论】:

    标签: c linux gcc linker shared-libraries


    【解决方案1】:

    我找到了我的问题的解决方案(或解决方法):添加 -Wl,--warn-unresolved-symbols,这会将错误变成警告。请注意,这仅在您绝对确定您的功能不依赖于undefined refernce to: 消息中提到的符号时才有效。

    【讨论】:

      【解决方案2】:

      在命令行中添加它们是一种方法。下面是这样的。 LD_LIBRARY_PATH 告诉 gcc 在哪里查找库,但您仍然需要说明要包含哪些库。

      gcc -L/customlibs testing.c -o testing -lcustom -lmylib1 -lmylib2 -lmylib3

      【讨论】:

      • 我试过了,它抱怨更多未定义的引用
      • Ulrik,哪些参考文献?您应该添加更多库...您可以在每个共享库上尝试ldd 命令以提取它所依赖的库,然后使用topological sort 或尝试将它们全部添加到链接命令(between -( and -) option pair) .
      • 当我使用-Wl,--start-group -lcustom1 -lcutom2 ... -Wl,--end-group 添加所有共享库时,我会收到更多消息,例如/customlibs/libcustom.so: undefined reference to AnotherCustomFunction'`
      【解决方案3】:

      您还应该通过添加 gcc 的 -I 选项来包含共享库的所有头文件,例如:gcc [...] -I/path/to/your/lib/header/files [...]

      【讨论】: