消除 C++ 动态库的编译器间不兼容问题
-
12-09-2019 - |
题
...,后续 这.
从我所参考的问题的答案中我了解到:
- 不同的编译器使用不同的名称修饰,这使得在使用编译器 B 构建的项目中无法使用使用编译器 A 构建的 C++ 动态库,
- 该库可以构建为静态,从而节省了项目中的 n 个头文件和源文件或导出符号。(它仍然无法保存重建库以供不同编译器使用。)
根据上述内容仔细研究 SDL,我意识到它的链接有两层:在我的 SDL 项目中,我静态链接 libSDL.a,而 libSDL.a 又动态链接 SDL.dll,从而消除了不同编译器对不同 .dll 版本的需要。
问题是这是否真的是这种情况以及问题的可行解决方案,还是我错过了一些东西(以及什么)?
解决方案
我认为你的做法是正确的。我会这样说:
- 为了使 dll 能够被不同的编译器使用,它必须仅包含 C 函数(可以使用 C++ 编译器使用以下命令来编译它们)
extern C
) - 与通常的 dll 一样,可以使用静态导入库,以便可以直接调用 dll 中的函数,而不需要通过名称加载
- 您可以使用一个包装库来代替常规导入库,将 dll 的 C 函数包装在 C++ 类和函数中
不隶属于 StackOverflow