在 Windows 下,使用 std::vector
从 DLL 导出一个类或 boost::shared_ptr
字段几乎总是会导致访问冲突。显然,在 Linux 上不是这样,可以导入
class Test {
public:
boost::shared_ptr<SomeObscureClass> data;
// ...
}
从一个共享库到一个已经链接到 Boost 的程序,它都可以工作......但是如何呢?
据我了解,Windows情况下崩溃的主要原因是主程序和共享库都有boost::shared_ptr<SomeObscureClass>
的模板实例。方法——例如,delete
和静态字段变得困惑,这会导致不好的事情。
但在 Linux 上它显然工作正常!我见过至少五个不同的 C++ 库,它们是在 Linux 上开发的,它们内置于共享库中,并且有 std::
领域,显然不会遇到任何问题。它是如何工作的?
最佳答案
与模板实例化相关的符号与其他符号没有任何区别。
在 Linux 上,共享库中所有未明确设为私有(private)的符号都被导出,因此进程将仅使用“第一个”库提供的符号(如果您想要共享库,您可能需要多加注意您的选项使用主要可执行文件提供的符号,但它也是可能的)。您可以将符号明确设为私有(private),并在需要时让共享库使用它提供的库;在过去,您必须为此使用链接描述文件,而如今,gcc 提供选项和属性来帮助细粒度控制。
我的理解(但我不是 Windows 方面的专家,这正是我在像这样的论坛上读到的)是在 Windows 上,默认值是相反的,所有未明确公开的符号都是私有(private)的,但你可以解决通过更改符号的属性来解决问题(我不知道这有多容易或多难)。
关于c++ - 从共享库导出模板化 C++ 类在 Linux 上如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575341/