chromium 源代码中的 BASE_EXPORT 有什么作用?

What does BASE_EXPORT in chromium sourcecode do?

在研究chromium source code I found that many classes are using a macro BASE_EXPORT defined in base_export.h 应该装饰类 和public 使用的功能

我只是无法理解这个概念?这是否应该替代具有包含文件夹的 "classical" 方法,例如放置所有 headers 供 public 使用的文件夹? BASE_EXPORT 是如何工作的?例如,在向 chromium 添加新功能时,应该如何使用这样的修饰函数?

非常感谢您提供有用的答案。

这是多个实现(操作系统)从 shared/dynamic 库导出函数所需的功能

Chromium 支持使用组件构建(多个共享库)和常规构建(单个库)构建 chrome。

在组件构建中,正在构建的组件,例如 BASE、NET、CONTENT,使用 <COMPONENT>_EXPORT 宏名称,例如:BASE_EXPORT 用于 BASE 组件。

当此宏用于构建组件时,宏在 MSVC 编译器上扩展为 __declspec(dllexport),在 GCC/Clang 上扩展为 __attribute__((visibility("default")))。这有助于组件导出要从外部使用的内容(外部可见性)。

当它的符号被使用 BASE 组件的其他组件使用时,通过包含它的 header,宏在 MSVC 上扩展为 __declspec(dllimport) 而在 GCC/Clang 上没有任何内容。这有助于其他组件从依赖组件导入内容。

如果这些模块在加载时支持隐式动态链接。

在常规构建时,此宏会展开为空。

参考: Chromium Modularization Component build / Shared Library / Multi-DLL build Exporting Symbols

另请参阅,GCC visibility, MSVC import/export