0

在 Windows 下,从 DLL 导出带有std::vectororboost::shared_ptr字段的类几乎总是会导致访问冲突。显然,Linux 上不是这种情况,并且可以导入

class Test {
public:
     boost::shared_ptr<SomeObscureClass> data;

     // ...
}

从共享库到已经链接到 Boost 的程序,它都可以工作......但是如何?

据我了解,在 Windows 案例中崩溃的主要原因是主程序和共享库都有boost::shared_ptr<SomeObscureClass>方法的模板实例 - 例如,delete静态字段会混淆,这会导致不好的事情。

但在 Linux 上它显然工作正常!我见过至少五个不同的 C++ 库,它们是在 Linux 上开发的,它们内置在共享库中,并且有std::字段,并且显然不会遇到任何问题。这是如何运作的?

4

1 回答 1

1

与模板实例化相关的符号与其他符号没有任何不同。

在 Linux 上,共享库所有未明确设为私有的符号都将被导出,因此进程将仅使用“第一个”库提供的符号(如果您希望共享库使用提供的符号,您可能需要更加注意您的选项由主可执行文件,但它也是可能的)。您可以将符号明确设为私有,并在需要时使用它提供的共享库;过去,您必须为此使用链接器脚本,而如今,gcc 提供了选项和属性来帮助进行细粒度控制。

我的理解(但我不是 Windows 专家,这正是我在类似这样的论坛上读到的)是在 Windows 上,默认设置是相反的,所有未明确公开的符号都是私有的,但您可以通过更改来解决问题符号上的属性(我不知道它有多容易或多难)。

于 2013-09-02T14:49:08.547 回答