0

我在 Linux 中创建了一个共享库(.so),我面临一个非常奇怪的问题。最初我在库中添加了 3 个函数(write_myown、setfolder、register),然后我又添加了一些函数(init、write_re)。

基本上整个库都是用 C++ 实现的,但是 API 需要从基于 C 和 C++ 的可执行文件中调用。因此,我为 API 使用了 extern "C"。

我面临的奇怪问题是,当我尝试使用函数 write_myown、setfolder 和 register 时,链接会通过并创建可执行文件。

但是当我尝试调用函数 init 或 write_re 时,链接失败,出现未定义的引用错误。

我认为但不确定的更奇怪的事情是,我想当我构建仅 C 的程序时它可以正常工作,但是当我构建基于 C++ 的代码时,就会看到这个问题。

我已经检查并确认了以下事项

  1. 库(.so)存在于 /usr/lib 中(我把它放在那里)
  2. ldconfig -p | grep mylibname 显示我的库存在。
  3. 当我不调用 init 或 write_re 时,会生成可执行文件,并且 objdump/readelf 会显示适当的引用。
  4. mylibrary.so 上的 ldd 显示 init 和 write_re 也存在,可见性是全局的。
  5. 创建的可执行文件或 .0 显示对 mylibrary 的正确依赖关系。
  6. 没有任何版本的 mylibrary。
  7. 我已经确认它引用了正确的.so。
  8. 我的库上的 nm 显示所有功能都存在。

知道我该如何解决这个问题吗?可能是什么问题。如果不是,我该如何进行调查。如果需要任何进一步的细节,请告诉我。

最好的问候, 帕万

4

1 回答 1

0

我面临的奇怪问题是,当我尝试使用函数 write_myown、setfolder 和 register 时,链接会通过并创建可执行文件。

但是当我尝试调用函数 init 或 write_re 时,链接失败,出现未定义的引用错误。

我的水晶球说:当你在你的文件中编写原型时write_myown,你已经添加了它们。setfolder.hextern "C"

但是当write_reextern "C"后来.cc添加.h.

如果是这样,

  • 函数在库中以未损坏的形式定义,并且
  • C可执行文件可以很好地使用它们,并且
  • C++引用它们的对象(在库之外)看不到它们extern "C",因此需要它们的损坏形式(库当然提供)。

我认为这个假设符合您当前问题中的所有事实,并且很容易验证:来自链接器的错误消息是说undefined symbol: write_re,还是说undefined symbol: write_re(some, parameter, types)

如果是后者,那就是某个对象引用了损坏的名称的致命赠品。

于 2013-02-08T04:19:32.373 回答