c++ - 从共享库导出模板化 C++ 类在 Linux 上如何工作?

标签 c++ linux boost shared-libraries

在 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/

相关文章:

c++ - 通过指向派生类的基指针 boost 序列化

c++ - 将构造函数参数转发给放置新运算符

线程间抛出异常的C++ Boost代码示例

c++ - cout 中的异常行为。它在声明另一个相同值的字符数组后打印两次字符数组

C++ 保护 : fail to access base's protected member from within derived class

c++ - 将 NULL 指针强制转换为对象并调用其成员函数之一是否有实际好处?

c++ - 如何忽略 MSVC 中未初始化的变量错误

c++ - 共享库的静态库中静态变量的单独实例

linux - 使用linux比较解析的数据以及在 ' if '或while循环中使用该比较

linux - 提高 avconv 负载和速度?