【发布时间】:2013-09-02 14:20:10
【问题描述】:
在 Windows 下,从 DLL 导出具有 std::vector 或 boost::shared_ptr 字段的类几乎总是会导致访问冲突。显然,在 Linux 上不是这样,并且可以导入
class Test {
public:
boost::shared_ptr<SomeObscureClass> data;
// ...
}
从一个共享库到一个已经链接到 Boost 的程序,它都可以工作......但是如何?
据我了解,在 Windows 案例中崩溃的主要原因是主程序和共享库都有 boost::shared_ptr<SomeObscureClass> 方法的模板实例 - 例如,delete 和静态字段会混淆,这会导致做坏事。
但在 Linux 上它显然可以正常工作!我见过至少五个不同的 C++ 库,它们是在 Linux 上开发的,它们内置在共享库中,并且有 std:: 字段,显然不会遇到任何问题。它是如何工作的?
【问题讨论】:
-
你提到的windows行为并不完全正确。只要使用 /MD(d) 选项,就可以导出包含 std 组件的类。这会动态链接 c++ 运行时,而不是将其编译到您的代码中。 Linux 行为类似,需要链接到 .so 运行时
-
boost::whatever不在 VS 运行时,它会导致问题。无论如何,运行时不能在其中实现例如boost::shared_ptr<SomeObscureClass>::operator*,因为它不知道SomeObscureClass。 -
您可以使用macros编译boost库来控制导出的接口。问题在于符号可见性而不是操作系统的某些限制。经验法则是,如果您导出资源获取函数,则还必须导出相应的清理函数。
标签: c++ linux boost shared-libraries