繁体   English   中英

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

[英]How does exporting templated C++ classes from shared library work on Linux?

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

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

     // ...
}

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

据我了解,Windows崩溃的主要原因是主程序和共享库都具有boost::shared_ptr<SomeObscureClass>方法的模板实例-因此,例如, delete和static字段会混淆,这导致坏事。

但是在Linux上,它显然可以正常工作! 我已经看到了至少五个在Linux上开发的不同的C ++库,这些库内置于共享库中,并且具有std::字段,并且显然没有任何问题。 这是如何运作的?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM