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