我有一个与共享库一起使用的程序。
我有一个库(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 :(得分:2)
这是失败的原因是你已经链接到不同的库,因此(如你所见)功能偏移是不同的。链接器已将偏移量放入已编译的二进制文件中,因此它仅针对该库运行。为了完成您在此处尝试的操作,您需要使用动态库加载,请参阅this SO问题以获取更多信息。
编辑:
稍微进一步阅读,我遇到了这个PDF,您可能会发现它很有帮助。
答案 1 :(得分:0)
(我没有足够的代表只在你的问题下面发表评论)
这可能是因为程序预先链接(Linux)或预绑定(MacOS),尽管我不是100%肯定。关于维基百科下面的一些基本信息。您是否在搜索手册中遇到过这种情况?
答案 2 :(得分:0)
编译库时是否忘记了-fPIC选项?请添加编译命令。