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