c++ - 如何使用(配置文件)包含编译时依赖#defines 的外部头文件?

标签 c++ cmake

假设我正在编译(静态)库 libfoo.a提供头文件 foo.h .我将链接我的应用程序 APP反对libfoo.a#include <foo.h>在我的源代码中。 libfoo正在使用 CMake作为具有用户定义变量的构建系统,例如 BUILD_WITH_OPTION_BAR作为定义传递给编译器:

ADD_DEFINITIONS(BUILD_WITH_OPTION_BAR)

内部foo.h我们会找到#ifdef使用此选项的声明:

#ifdef BUILD_WITH_OPTION_BAR
   typedef long long int fooInt;
#else
   typedef int fooInt;
#endif

我的问题是:我应该如何知道我的 APPlibfoo.a构建时使用或不使用 BUILD_WITH_OPTION_BAR

换句话说:我必须在何时何地定义 BUILD_WITH_OPTION_BAR在我的里面 APP

我的基本理解是图书馆libfoo应该提供某种 config.h foo.h 中包含的文件, 但你如何获得一个可选 #define BUILD_WITH_OPTION_BAR在编译时(libfoo)?

我发现了这个相关问题:add_definitions vs. configure_file但它没有讨论如何这实际上是如何完成的。

最佳答案

方法是创建一个包含定义的“config.h”文件,而不是将它们作为命令行参数传递给编译器。您可以使用库文件分发 config.h 文件。

Cmake 提供了一种生成此类文件的机制。

CONFIGURE_FILE(<src filename>, <dest filename>)

通常源文件名为“config.h.in”,输出文件名为“config.h”。在这样的 .in 文件行中:

#cmakedefine BUILD_WITH_OPTION_BAR 1

替换为

#define BUILD_WITH_OPTION_BAR 1

如果启用该选项,否则它们将被注释掉。

参见 https://cmake.org/cmake/help/v3.0/command/configure_file.htmlhttp://www.vtk.org/Wiki/CMake:How_To_Write_Platform_Checks了解更多。

关于c++ - 如何使用(配置文件)包含编译时依赖#defines 的外部头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38406704/

相关文章:

c++ - ClockTimer 以秒或毫秒显示值?

macos - cmake 从现有源生成 Xcode 项目

c++ - LNK2019 当包含 asio header 时,使用 cmake 生成的解决方案

vue.js - 错误 "Cannot read property ' indexOf' of undefined"绑定(bind) n-api 模块

android - 添加日志时 CMakeLists.txt (target_link_libraries) 中的 CMake 错误

windows - 需要在 github 操作工作流程中将反斜杠转换为正斜杠

c++ - 如何有效地清除 std::queue?

c++ - 混合 getter/setter 和普通变量

c++ - 当超过可能的虚拟地址数量时会发生什么

c++ - 为什么需要告诉结构它们有多大?