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

时间:2011-12-19 16:29:28

标签: c++ cmake

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

set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project

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

MY_MACRO:UNINITIALIZED=1

我该怎么做?

4 个答案:

答案 0 :(得分:20)

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

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default

其次是条件:

IF(DEFINE_MACRO)
    ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)

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

cmake -DDEFINE_MACRO=OFF ..

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

make VERBOSE=1

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

该问题背后的动机是批量构建第三方库,这就是为什么我要避免修改CMakeLists的原因。这么多年后,即使我不再需要它了,我也发现可以通过 CMake外部的手段轻松实现:

  • 照常调用CMake,没有特殊标志。

  • 然后:

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

      set CL=/DMY_MACRO=1 %CL%
      

      然后调用MSBuild来完成其工作。

    • 与其他工具链:可以通过在调用CFLAGS之前设置CXXFLAGSmake环境变量来实现,但是我没有检查。

答案 3 :(得分:-5)

除非您有充分的理由,否则您应该使用ADD_DEFINITIONS(<name>=<value>[, ...])

只需将以下行添加到您的CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1")

CMake将负责交换机的语法(无论是-D<name>=<value>还是/D<name>=<value>)。