我尝试在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
我该怎么做?
答案 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
之前设置CXXFLAGS
或make
环境变量来实现,但是我没有检查。
答案 3 :(得分:-5)
除非您有充分的理由不,否则您应该使用ADD_DEFINITIONS(<name>=<value>[, ...])
。
只需将以下行添加到您的CMakeLists.txt:
ADD_DEFINITIONS("MY_MACRO=1")
CMake将负责交换机的语法(无论是-D<name>=<value>
还是/D<name>=<value>
)。