我有一个交叉平台C++应分成几个共用图书馆和装载的额外的功能插件的共享图书馆。插图书馆都应该是自给自足的和功能,通过自己的不知情的情况下或依赖于调用的应用程序。

一个插件中包含的复制代码自主应用,所以包含符号的名字是重复那些在发动机。(是的,我知道,通常是一个没有-没有,但当时的插件是书面的引擎是一个整体的二进制并不能共享库。) 在窗户,一切都好。在Linux上我们得到segfaults.看堆的丝的错误,这是发生在插当调职能的重复类的名称。这似乎是一结果的机插件和具有略微不同版本的共享码(某些类功能是说出在插件).这是因为,如果插件是得到它的符号的运行时链接到发动机的,而不是自己的。我们的"固定"的问题,通过改变 dlopen's参数 dlopen(pFilepath, RTLD_LAZY | RTLD_LOCAL).

但是,当我们就改写了发动机可以分成共用图书馆(最终目的重复使用的插件),我们得到的出现段错误的错误。和看堆的跟踪,从引擎->件>引擎。

有没有一种方法指定的运行时连接不符号的插件的发动机(特别是如果他们是定义中插件)?

谢谢!Matt


编辑2009-12-3

我第一次尝试到包裹的插件的代码在它自己的名字空间。没有工作,因为它是静态链接到一个图书馆,还链接到引擎。该版本的静态图书馆是不同的,因此出现段错误!

然后我改变了建立的引擎,它的图书馆是静态的联系。当我运行了它,我不再有问题。所以出现这一结果具有公共图书馆符号出口,然后是动态地迁入的插件,当它被打开了。但是,当所有的发动机的代码是一个可执行的,它不出口的符号(所以它并不试图重新定位的插件的符号转发动机)。

我还有一个问题,因为有一个并行的程序版本(采用开放-MPI),而仍然得到出现段错误.它出现在,它仍然是出口的引擎,是符号和搬迁的插件。这可能需要如何打开-MPI执行该应用程序。

是否有任何连接标志可使用的插件的共享图书馆,它将告诉它不要动态地重新定位的符号在运行时?或者隐藏的符号所以他们不会搬迁?我已经试过了 -s ("省略所有的符号的信息"),但显然没有改变这一动态的符号(检查使用 nm -D <plugin>).

有帮助吗?

解决方案

我想我已经找到了解决办法,该接头的标志 -Bsymbolic.从本质上讲,这标志增加了一个标志在公共图书馆来说运行连接尝试解决的符号名称本身内第一次。该引擎能够运行的插件只是现在所有情况下(单exe,exe w/shared libs,插w/w/o包namespace)当的插件是与这标志。

这里似乎是一些批评者与有关的警告 -Bsymbolic:
http://www.technovelty.org/code/c/bsymbolic.html
http://software.intel.com/en-us/articles/performance-tools-for-software-developers-bsymbolic-can-cause-dangerous-side-effects/

但是考虑到他们的警告和什么样的意图是,我认为这是正确的选择我。至少现在如此。

其他提示

我同意格伦 - 你不会真正解决这个问题,除非你修改类的名字,可能是通过命名空间。即使36个文件可能会花费较少的时间比试图可靠地解决它在不改变符号的名称进行修改。

通过识别所有的名字必须进行调整的类开始。你可能链接列出他们已经为你。然后我会改变的名称两个组类(从富到引擎:: Foo和插件::美孚例如)至少是暂时的。这样,你可以让编译器找到有问题的类的所有引用。在插件的源突突距离,直到该插件与正确的新插件类名称的引用编译。一旦做到这一点,发动机::类变回自己的旧名称(除非你想永久修改引擎源也是如此,它听起来就像你不知道)。该插件现在应该编译和链接到正确的,唯一命名的类。

我只想包装所有插件的代码与PluginX命名空间。这一定会救你从这些错误。 这是一个非常不错的,重要的,反正练

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top