我正在开发一个带有插件系统的跨平台c ++ / qt项目,我们在linux上使用so文件,在windows上使用dll。我们在Linux上使用gcc,在Windows上通过cmake使用Visual Studio 2010。 问题是我们的插件有时需要从应用程序源代码中调用一个函数,只需包含头文件就可以在Linux上使用gcc。但是在Visual Studio上,我们得到了未解决的外部符号错误。
是因为这样,dll文件的工作方式不同吗?
谢谢。答案 0 :(得分:2)
在Windows上从dll导出符号的默认行为完全相反:默认情况下,符号是不可见的,您需要显式导出它们。使用VC ++,这是由__declspec(dllexport)
declarators完成的。
EDIT(已添加信息):您正在进入一个非标准化,系统特定行为的区域......在C ++中编写跨平台“可插拔”组件系统的问题比您预期的要多得多。在Windows上有所谓的导入库,它定义从dll导出的所有符号。您必须链接这些库才能解析这些符号。这称为implicit linking。您还可以明确链接,这意味着在运行时加载DLL及其导出的符号。然而,与所谓的二进制兼容性问题相比,所有这些只是技术细节,如果在组件系统的设计过程中不予考虑,这几乎肯定会让你失望。
我想知道一件事:你说你在使用Qt。 Qt应用程序框架拥有自己的跨平台约定和规则,用于编写和构建可插入组件。你为什么不坚持这些......?