【问题标题】:Linking with .so in g++ results in undefined references在 g++ 中与 .so 链接会导致未定义的引用
【发布时间】:2016-11-29 13:21:12
【问题描述】:

为了简单起见...假设我有以下内容:A.lib、libB.so(使用 A.lib)和 C.exe(使用 libB.so)。注意:这是 Linux,而不是 Windows。我只是使用 .exe 来传达二进制类型/目的。

我只是想从命令提示符编译和链接 C.exe,因为它只是一个简单的测试程序。这是我正在使用的线路:

g++ -I../include C.cpp -o C.exe -L../lib -lB

结果是对 A.lib 中的事物的许多未定义引用。引用从 libB.so 导出的任何内容都没有错误。

如果我将 libB.so 复制到同一目录并使用此命令:

g++ -I../include C.cpp -o C.exe -lB

结果是C.exe构建完成,可以正常运行。

一旦构建了 libB.so,我就不需要用于构建它的库。尽管如此,我想我会尝试一些作为最后的尝试。我将 A.lib 复制到与 libB.so 相同的 lib 目录中,并再次尝试了原始构建命令。结果是一样的。

感谢所有想法。

【问题讨论】:

  • 你是如何链接libB.so的?您是否明确链接到A.lib
  • 使用-R 选项,除了-L。有关详细信息,请参阅 ld 的手册页。
  • 顺便问一下,A 库是静态库还是动态库?
  • @Some 程序员老兄 - 很抱歉不清楚。 A.lib 是静态的并与 libB.so 显式链接。
  • @SamVarshavchik - 是的,解决了它。谢谢!

标签: c++ linux g++ shared-libraries


【解决方案1】:

SamVershavchik 让我找到了答案。我首先尝试了这个命令:

g++ -I../include C.cpp -o C.exe -Wl,-R,../lib -lB

结果是一个干净的构建,但是当我运行 C.exe 时另一个关于缺少符号的错误。

我将命令修改为:

g++ -I../include C.cpp -o C.exe -Wl,-R,--just-symbols=../lib/libB.so -lB

这导致了一个干净的构建,并且能够无错误地运行 C.exe。

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多