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