相关疑难解决方法(0)

C ++模块和动态链接的预期关系是什么?

C ++模块TS为消除预处理器,缩短编译时间,并为至少非模板代码至少支持C ++中更健壮,模块化的代码开发提供了绝佳的工具。

底层机制可控制普通程序中符号的导入和导出。

但是,开发用于两种动态加载的库存在一个主要问题:启动时加载和运行时加载。此问题涉及从库中导出符号,通常会在可见性方面进行讨论。

通常,并非所有用于构建动态链接库的翻译单元的外部符号都应对用户可见。此外,在运行时加载时,尤其是在使用插件概念加载时,必须从许多同时加载的库中导出同一符号。

在Windows上使用语言扩展

 __declspec(dllexport)
 __declspec(dllimport)
Run Code Online (Sandbox Code Playgroud)

附加在源代码中作为符号的属性,最近在unix平台上的gcc和clang系统上,

__attribute__((visibility("default")))
__attribute__((visibility("hidden"))) 
Run Code Online (Sandbox Code Playgroud)

旨在支持打算由图书馆公开的符号的提供和使用。使用它们是复杂且混乱的:在Windows上,在编译库时必须使用宏来导出符号,而在使用它们时则要导入它们。在unix平台上,必须将可见性设置为默认设置,以同时导出和导入符号,由编译器根据是否找到定义来决定其自身:必须使用以下命令调用编译器:

-fvisibility=hidden 
Run Code Online (Sandbox Code Playgroud)

开关。静态链接不需要export / import属性,可能应该将其宏化为空字符串。编写代码并摆弄构建系统,以使所有这些工作正常进行,尤其是考虑到#include必须在库翻译单元的编译过程中设置正确的符号可见性,这非常困难,存储库中所需的文件结构混乱,源代码杂乱无章与宏,总的来说,整个事情都是一场灾难。几乎所有开放源代码存储库都无法正确导出符号以进行动态链接,并且大多数程序员都不知道动态库代码结构(使用两级名称空间)与静态链接完全不同。

可以在此处看到如何执行此操作的示例(希望正确):

https://github.com/calccrypto/uint256_t

该存储库曾经有2个标头和2个实现文件,内置库的用户将看到2个标头。现在有7个头文件和2个实现文件,内置库的用户将看到5个头文件(其中3个扩展名include表示不直接包含这些文件)。

因此,在经过漫长的解释之后,问题是:最终的C ++模块规范是否有助于解决动态链接符号的导入和导出问题?我们可以期望能够开发共享库而不会用供应商特定的扩展名和宏来污染我们的代码吗?

c++ c++-modules

5
推荐指数
1
解决办法
378
查看次数

标签 统计

c++ ×1

c++-modules ×1