c++ - 是否导出共享库中类的构造函数?

标签 c++ unix shared-libraries shared

我有一个包含类 Foo 的共享库 lib.so。我正在动态加载(在 UNIX 上使用 dlopen)lib.so。加载后我想创建一个 Foo 的实例。
我可以简单地使用 new 运算符来创建 Foo 的对象吗,或者我必须创建一个导出的工厂方法放在 lib.so 中会为我创建那个对象吗?

实际上,问题是 Foo 的构造函数是否被导出,以及是否可以简单地用 new 运算符调用。我认为 UNIX 上共享库中的所有类和方法在默认情况下都是导出的,我不必像在 Windows dll 上那样显式导出它们。

除了隐藏Foo对象的创建(和可能初始化)方式外,在创建共享库中包含的类的对象时,是否还有其他使用工厂方法的原因?

最佳答案

基本答案是肯定的。然而,细节决定成败。在 Windows 上,使用 Microsoft C++ 编译器,所有符号,无论它们是方法、变量等,默认情况下都不会为 DLL 导出。您需要显式导出函数、类和/或全局变量。我相信 Borlands 编译器也是如此(我可能是错的)。

对于 GCC,过去的情况是默认情况下导出所有内容,您无法真正控制它。几年前,这随着添加的属性而改变(我不记得它到底叫什么,但它的工作方式类似于等效的 Microsoft __declspec(dllexport) )。

因此,如果您定义一个类并将其标记为已导出(无论您选择这样做),它的构造函数都会被导出。然而,正如前面的海报所提到的,由于 C++ 的性质,符号的名称会根据您使用的编译器而变化,有时还会根据 C++ 编译器的版本而变化。这不一定是个问题,这取决于你想如何使用东西,但这确实意味着你必须意识到这一点。

关于c++ - 是否导出共享库中类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3778494/

相关文章:

c++ - 车牌在符号上的分割

c++ - 我怎样才能使这个 Makefile 更通用?

java.lang.运行时异常 "Cannot run program"

c - 系统调用 "open()"中的 O_TRUNC 实际上并未删除文件内容

c++ - 什么是仅 header 库

c++ - 具有未定义大小的数组作为类成员

c++ - 使用浮点键实现类似哈希表的数据结构,其中容差范围内的值被合并在一起

Python:守护进程与无限循环

c - 将 .so 文件链接成可执行文件

c++ - CMake 将依赖项复制到可执行输出路径