我有一个包含类 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/