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

ndasle7k  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(227)

我试着在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


我该怎么做?

des4xlb0

des4xlb01#

一个好的替代方法是定义一个cmake选项:

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

字符串
然后是一个条件:

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


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

cmake -DDEFINE_MACRO=OFF ..


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

make VERBOSE=1


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

rjjhvcjd

rjjhvcjd2#

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

tp5buhyn

tp5buhyn3#

这个问题背后的动机是批量构建第三方库,这就是为什么我想避免修改CMakeLists。所以几年后,即使我不再需要它,我发现它可以通过CMake外部的方式轻松实现

  • 像往常一样,没有特殊的标志。
  • 然后:
    ***使用MSVC:**编译器读取CL环境变量以获取额外的命令行参数。因此
set CL=/DMY_MACRO=1 %CL%

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

***使用Makefiles:**生成的makefiles使用CFLAGSCXX_FLAGS变量,就像makefiles预期的那样。因此构建可以通过以下方式开始:

make CXX_FLAGS=-DMY_MACRO=1


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

s3fp2yjn

s3fp2yjn4#

另一种方法是使用文档中的CXXFLAGS环境变量。该环境变量用于初始化CMAKE_CXX_FLAGS缓存条目,因此需要在首次生成构建文件时使用它,如果您随后需要更改CXXFLAGS值,则需要重新生成构建文件。
例如:

# CD to the build directory
cd <build_dir>

# Clean the build files including cmake cache
rm -rf *

# Generate build files with the CMAKE_CXX_FLAGS containing our MYMACRO define
CXXFLAGS=-DMYMACRO cmake <source_dir>

# Build the project with the MYMACRO being defined 
cmake --build .

字符串

xtfmy6hx

xtfmy6hx5#

除非你有一个很好的理由,否则你应该使用ADD_DEFINITIONS(<name>=<value>[, ...])
只需将以下一行添加到CMakeLists.txt中:

ADD_DEFINITIONS("MY_MACRO=1")

字符串
CMake将负责开关的语法(无论是-D<name>=<value>还是/D<name>=<value>)。

相关问题