是否有一种跨平台的方法可以从构建共享库的 C 项目中选择性地导出某些函数和结构?
我想以一种不需要特定构建系统的方式(可见性应该在代码中定义,例如作为宏),并且以 GCC 和 MSVC 都可以理解的方式进行。
谢谢你。
是否有一种跨平台的方法可以从构建共享库的 C 项目中选择性地导出某些函数和结构?
我想以一种不需要特定构建系统的方式(可见性应该在代码中定义,例如作为宏),并且以 GCC 和 MSVC 都可以理解的方式进行。
谢谢你。
当然,严格来说不是,因为工具链不一样。
但是人们这样做。复杂之处在于,在 Windows 中,您需要在定义__declspec(dllexport)
函数的库中的位置和引用函数的客户端代码的位置中专门标记要从 DLL 导出的函数声明。因为标准 C 实践在单个头文件中只有一个声明,这意味着您通常需要做一些宏工作才能拥有在两个位置都有效的单个前缀。似乎每个项目都为此选择了自己的标准。__declspec(dllimport)
在 Unix 方面,您根本不需要标记导出,这很好。这是因为默认情况下会导出每个非静态函数,这不是很好。只要您的非公共/非静态符号具有合理的前缀,通常您就可以摆脱这种情况,大多数项目似乎都是这样做的。如果您需要更好地控制导出的符号,可以使用 Solaris 样式的“mapfile”和 GNU 链接器的 --version-script(solaris 下的 -M)参数来明确定义哪些符号应该出现在外部命名空间中。
平台之间还有一些陷阱,例如每个库全局命名空间的工作方式以及启动/关闭代码的处理。基本上,它是一个老鼠窝,无法在这么短的文章中合理地解释,但只要你小心你的库包含简单的函数并且你的命名空间不污染,你就不应该有太多麻烦。查看一些更流行的跨平台共享库(例如 Qt、Glib/Gtk+、任何与 msys 一起分发的东西等)以获得指导。