以跨平台方式导出共享库符号?

时间:2009-10-06 19:03:02

标签: c gcc shared-libraries visual-c++ dllexport

是否有跨平台方式从构建共享库的C项目中有选择地导出某些函数和结构?

我希望以一种不需要特定构建系统的方式(可见性应该在代码中定义,例如作为宏),以及GCC和MSVC都能理解的方式。

谢谢。

1 个答案:

答案 0 :(得分:4)

当然严格禁止,因为工具链不一样。

但人们这样做。复杂性是在Windows中,你需要 专门标记要从中导出的函数的声明 在库中的位置具有__declspec(dllexport)的DLL 该功能在位置中已定义__declspec(dllimport) 在客户端代码中,功能引用。因为标准 C实践在单个头文件中只有一个声明,这个 意味着你通常需要做一些宏观工作来拥有一个 在两个位置都有效的前缀。这似乎是每个项目 为此选择了自己的标准。

在Unix方面,你根本不需要标记导出,这很好。 这是因为默认情况下导出每个非静态函数, 哪个不太好看。通常你只要能逃脱这一点 你的非公共/非静态符号有明智的前缀,这是什么 大多数项目似乎都这样做。如果你需要更好地控制你的 导出的符号,您可以使用与GNU相同的Solaris风格的“mapfile” 链接器的--version-script(在solaris下的-M)参数,用于明确定义应出现哪些符号 在外部命名空间中。

平台之间还有一些问题,比如 每库全局命名空间的工作原理和处理方式 启动/关闭代码。基本上,它是一个不可能的老鼠巢 在这篇文章中简明扼要地解释了,但只要你小心 您的库包含简单的函数而您的命名空间不包含 污染,你应该没有太大的麻烦。看看其中一些 流行的跨平台共享库(例如Qt,Glib / Gtk +,任何东西 与msys等分发......)以获得指导。