2013-02-06 22 views
0

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

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

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

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

即使是我认为但并不确定的陌生事物,我猜想当我构建C程序时它只能正常工作,但是当我构建基于C++的代码时,可以看到此问题。

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

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

任何想法如何我可以解决这个问题?可能是什么问题。 如果不是我可以继续调查。 请让我知道是否需要任何进一步的细节。

最好的问候, 帕

+1

'write'是'libc.so.6'中的一个函数,'register'是关键字。你应该使用不同的名字... –

+1

如果给出一个C接口,通常让所有的符号共享一个共同的前缀....所以重命名所有的函数,以便tkeir名称以例如“ 'pavan_' –

+0

嗨巴西尔,感谢您的回复,抱歉,我没有使用任何标准函数名称。 – PavanMysore

回答

0

我对着奇怪的问题是,当我尝试使用write_myown的功能,setfolder并注册,连接会突破并创建可执行文件。

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

我的电子结构球说:当你在你.h文件写道原型write_myownsetfolder,您添加extern "C"他们。

但是当你后来添加write_re,你把extern "C"他们的定义在.cc文件,但忽略了将其添加到他们的原型在.h

如果是这样,

  • 的功能是定义与库中它们的非错位形式,并且
  • C可执行文件可以精细使用它们,以及
  • 一个C++对象引用他们(在图书馆外)不是看到extern "C"对他们,所以想他们的mangled形式(当然这是不是由图书馆提供)。

这个假设,我认为目前适合所有的事实,你的问题,是微不足道的验证:没从链接错误消息说undefined symbol: write_re,还是它说undefined symbol: write_re(some, parameter, types)

如果是后者,那是某个对象引用损坏的名称的死件。