2012-08-30 19 views
3

我有一个程序要与共享库一起使用。C++共享,所以在运行时更改了库

我有一个库(1)是与充分的代码的方法即

class A 
{ 
public: 
    int* funcA(int a, int b) 
    { 
     int* pInt = new int; 
     *pInt = a + (b * 20); 
     return pInt; 
    } 
}; 

然后,我有另一个库(2)与完全相同的名称和接口编译没有什么方法,即伪类

class A 
{ 
public: 
    int* funcA(int a, int b) 
    { 
     return 0; 
    } 
}; 

(注:代码只是用来说明我的问题)

如果我编译反对库1然后用库1在运行时,按预期工作的一切。

如果我编译反对库2然后用库1在运行时,第一个叫FuncA的死亡。

如果我使用nm -D libMy.so并在运行时查看funcA的偏移量,则它是不同的。这是否包含在二进制文件中?

我已阅读各种手册和教程,但对于编译和运行时环境如何导致此故障并不明智。我原以为界面是一样的,所以这个方法会成功。

谢谢。

+0

当你说“针对编译”时,你的意思是你已经链接库1或库2的lib文件吗?在这种情况下,你必须使用链接的'library.so'文件。 – pstrjds

+0

对不起,是的,我的意思是链接库2和使用库1.我对它失败的原因感兴趣。 – embeddedbob

回答

0

(我没有足够的代表,只是让你的问题在下面留言)

这可能是因为程序预链接(Linux)或prebinded(MacOS的),虽然我不是100%肯定。关于它的一些基本信息在下面的维基百科上。您是否通过手册在您的搜索中遇到过这种情况?

http://en.wikipedia.org/wiki/Prelink

http://en.wikipedia.org/wiki/Prebinding

+0

不,尽管我认为部分原因是我不完全确定我在找什么。我有一个阅读。 – embeddedbob

2

,这是失败的原因是你已经针对不同的库链接,从而(如你所看到的)功能偏移是不同的。链接器已将偏移量放入编译后的二进制文件中,因此它只会针对该库运行。为了完成你在这里尝试的东西,你将需要使用动态库加载请参阅this SO问题的更多信息。

编辑:
随着一点点阅读,我碰到这个PDF,你可能会发现它有帮助。

+0

谢谢,问题已解决。 – embeddedbob

0

编译库时是否忘记了-fPIC选项?请添加编译命令。