【问题标题】:Undefined symbols in a shared library compiled with a static library使用静态库编译的共享库中的未定义符号
【发布时间】:2014-07-24 10:48:45
【问题描述】:

我在一个可执行项目中使用它链接不同库时遇到问题。

假设项目 A 包含一个名为 foo() 的函数;它被编译为静态库。
项目 B 包含一个名为 bar() 的函数,包括来自 A 的头文件并编译为与 -Wl--whole-archive libA.a -Wl--no-whole-archive flags 的共享库。
libB.so 已移至 /usr/lib

现在,项目C包含B.h,调用bar(),但由于未定义对项目A中定义的foo()函数的引用而没有编译。

nm libB.so 说:

U foo

我用的是gcc,编程语言是C,IDE是Eclipse CDT。

有没有人有解决这个问题的想法或技巧?

谢谢。

【问题讨论】:

  • “nm ”是什么意思?
  • @Icarus3:上面写着 T foo()
  • 那很好。现在你可以使用 gcc 命令行来构建共享对象了吗?我问的原因是,我在最后尝试了这个,“nm ”显示“T foo”。因此,在构建共享对象时一定会发生一些奇怪的事情。
  • @Icarus3 这里是:gcc -Wl,--whole-archive /usr/lib/libA.a -Wl,--no-whole-archive -shared -o "libB.so" ./sys/sys_confs.o ...其他目标文件... ./mpt_srvlib.o -lssl -lm -lrt -lpthread
  • 抱歉,我无法在最后重现此内容。只是为了我使用 gcc-4.8.2 的信息。

标签: c linker shared-libraries static-libraries inclusion


【解决方案1】:

感谢Icarus3的贡献,问题得到了限制。

ProjectA 中的一些函数使用了restrict 关键字,因此它是用-std=gnu99 编译的。事实证明,从代码中删除这个关键字并从编译命令中删除 -std=gnu99 最终解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2018-03-06
    • 2016-10-16
    • 2011-07-19
    • 2020-01-10
    • 2015-11-15
    相关资源
    最近更新 更多