C ++共享,因此库在运行时更改

时间:2012-08-30 14:51:48

标签: c++ shared-libraries

我有一个与共享库一起使用的程序。

我有一个库(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的偏移量,则会有所不同。这包含在二进制文件中吗?

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

编辑:
稍微进一步阅读,我遇到了这个PDF,您可能会发现它很有帮助。

答案 1 :(得分:0)

(我没有足够的代表只在你的问题下面发表评论)

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

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

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

答案 2 :(得分:0)

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