繁体   English   中英

链接到Linux上我自己的共享库中某些功能的问题

[英]Issues with linking to certain functions in my own shared library on Linux

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

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

我面临的一个奇怪的问题是,当我尝试使用函数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. 没有任何版本的图书馆。
  7. 我已经确认它引用了正确的.so。
  8. 我的库中的nm表明所有功能都存在。

知道我该如何解决吗? 可能是什么问题。 如果没有,我该如何进行调查。 如果需要其他详细信息,请告诉我。

最好的问候,帕万

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

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

我的write_myown说:当您在.h文件中为write_myownsetfolder编写原型时,已在它们中添加了extern "C"

但是,当您以后添加write_re ,您将extern "C"放在.cc文件中的定义中,但忽略了将其添加到.h的原型中。

如果是这样的话,

  • 这些函数在库中以其非混杂形式定义 ,并且
  • 一个纯C可执行文件可以很好地使用它们,并且
  • 一个C++引用它们(库外)对象没有看到extern "C"上他们,因此希望其受到损坏的形式(这是被库提供当然)。

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

如果是后者,那是一些对象引用错位名称的破绽。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM