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

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

是否有一种跨平台的方法可以从构建共享库的 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/

相关文章:

c++ - 测试位以创建字符串 - 有更好的方法吗?

c++ - 继承二级基类构造函数: silent error

c - 混合 fPIC 和非 fPIC 对象模块

cmake - find_library 或 link_directories 或 find_package?什么是更好的方法?错误 - 使用 cmake 链接库

c - C 中的池化内存 - 内存管理

c - 当从字符串文字初始化 char 数组时会发生什么?

c++ - 还有其他方法可以为乘法表编写循环以获取运行时值吗?

linux - 如何使用 gcc 的自定义位置在 Linux 上安装 boost?

C程序在插入后查找数组中元素的数量并且在插入时不计数

c++ - 编译静态库时收集所有头文件