【问题标题】:Function becomes undefined when creating dynamic library创建动态库时函数未定义
【发布时间】:2021-08-11 20:56:35
【问题描述】:

一个相对较大的项目正在使用许多对象(主要来自 C 文件)来创建多个可执行文件和动态库。例如,其中一个文件 (gxdb.c) 创建了一个名为 gxdbkq 的函数,它(在目标文件的详细信息中)显示为:

...
00000000000007b0 T gxdbkq
...

但是,当我检查共享库时,该函数已变为未定义:

...
                 U gxdbkq
...

问题可能在链接阶段,但我什至不知道如何开始解决这个问题。

【问题讨论】:

  • 请构造一个minimal reproducible example。也就是说,编写少量代码,显示用于将其构建到 lib 中的确切命令,最后显示生成的符号。
  • 配置执行程序创建一个将近 1,000 行长的 Makefile 和一个接近 12,000 行的 libtool。我不知道如何隔离问题,因为许多其他函数似乎编译正常。
  • 代码可以从cola.gmu.edu/grads下载。
  • 你有尝试过吗?查看构建日志,提取最终构建命令并提出一个小代码示例来尝试单独重现问题。这么少的信息很难提供帮助。
  • 我知道这是一个艰难的过程,但我希望有人遇到过类似的事情,并且可以提供一些启示。配置日志没有提供太多信息,因为从操作系统的角度来看,一切都是成功构建的(问题是某些函数由于某种原因在库中变得未定义)。

标签: c linker


【解决方案1】:

问题可能在链接阶段

是的,最可能的问题是您没有将gxdb.o 链接到您的库中。

另一种可能性是您的链接行有一个“流浪”标志,这使得链接器忽略下一个参数,恰好是gxdb.o

您应该仔细检查您的链接行,确保上面有gxdb.o,并且没有意外的标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2021-06-18
    • 1970-01-01
    • 2012-10-23
    • 2012-10-22
    • 2020-04-10
    相关资源
    最近更新 更多