如何使用CMake通过命令行定义C++预处理器宏?

ybu*_*ill 28 c++ cmake

我尝试在CMake的命令行中设置预处理器宏.我试过了:

set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project
Run Code Online (Sandbox Code Playgroud)

但是我在编译时既没有定义,也没有MY_MACRO在CMake生成的文件中找到该名称,除了CMakeCache.txt它在表单中的位置:

MY_MACRO:UNINITIALIZED=1
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

fre*_*ass 25

一个很好的选择是定义一个cmake选项:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
Run Code Online (Sandbox Code Playgroud)

其次是条件:

IF(DEFINE_MACRO)
    ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用-D标志通过命令行使用cmake打开/关闭该选项.例:

cmake -DDEFINE_MACRO=OFF ..
Run Code Online (Sandbox Code Playgroud)

要确保编译器正在接收定义,可以在详细模式下调用make并检查是否定义了宏:

make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)

这也是一个很好的解决方案,因为make在任何cmake选项更改时都会重新编译代码.

  • 这需要修改CMakeLists,因此它不是解决方案(-1). (10认同)
  • @YakovGalka 并不完全正确,他建议事先更改 CmakeLists.txt,以便可以在后续构建中定义/取消定义宏。同意它没有提供更多的灵活性,但对于大多数用例来说,这正是人们所需要的。 (3认同)
  • 可以使用“add_compile_definitions”代替“add_definitions”。请参阅[通过 cmake 定义预处理器宏](/sf/ask/631230141/)。 (2认同)

ybu*_*ill 11

问题背后的动机是批量构建 3rd 方库,这就是为什么我想避免修改 CMakeLists.txt 的原因。多年后,即使我不再需要它,我发现它很容易通过CMake 外部方式实现:

  • 像往常一样调用 CMake,没有特殊标志。

  • 然后:

    • 使用 MSVC:编译器读取CL环境变量以获取额外的命令行参数。所以

        set CL=/DMY_MACRO=1 %CL%
      
      Run Code Online (Sandbox Code Playgroud)

      然后调用 MSBuild 来完成它的工作。

    • 使用 Makefile:生成的 makefile 使用CFLAGSCXX_FLAGS变量作为 makefile 的预期用途。所以构建可以通过

        make CXX_FLAGS=-DMY_MACRO=1
      
      Run Code Online (Sandbox Code Playgroud)

      或者通过设置相应的环境变量。

  • 在偶然发现这个问题后,我发现 `cmake -E env CXXFLAGS="-DMY_MACRO" cmake SourcePath` 在我的情况下有效(src:/sf/answers/3105017121/)。但不确定这是否也会完全覆盖。 (3认同)
  • 这是命令行构建的一个很好的解决方法,但我还希望用户能够使用 IDE 打开生成的解决方案文件,在这种情况下这将不起作用。遗憾的是,即使在 2020 年,也无法添加到 CMAKE_CXX_FLAGS 而不是指定(覆盖)它们。 (2认同)

Sla*_*Nov 10

试试这个: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

  • 这一半确实有效.它会覆盖`CMAKE_CXX_FLAGS`的值.我已经尝试过`-D CMAKE_CXX_FLAGS ="/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}"``但是`$ {CMAKE_CXX_FLAGS}`没有得到扩展.谁知道如何解决这个问题? (5认同)
  • `-DCMAKE_CXX_FLAGS:=" - D_GLIBCXX_USE_CXX11_ABI = 0 -DTSI_OPENSSL_ALPN_SUPPORT = 0"`似乎对我有用 (4认同)