我试着在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
型
我该怎么做?
5条答案
按热度按时间des4xlb01#
一个好的替代方法是定义一个cmake选项:
字符串
然后是一个条件:
型
然后你可以通过命令行使用cmake使用
-D
标志来打开/关闭该选项。示例:型
要确保编译器正确接收定义,您可以在详细模式下调用make并检查是否定义了宏:
型
这也是一个很好的解决方案,因为
make
会在任何cmake选项更改时重新编译代码。rjjhvcjd2#
试试这个:
-D CMAKE_CXX_FLAGS=/DMY_MACRO=1
tp5buhyn3#
这个问题背后的动机是批量构建第三方库,这就是为什么我想避免修改CMakeLists。所以几年后,即使我不再需要它,我发现它可以通过CMake外部的方式轻松实现:
***使用MSVC:**编译器读取
CL
环境变量以获取额外的命令行参数。因此字符串
然后调用MSBuild来完成它的工作。
***使用Makefiles:**生成的makefiles使用
CFLAGS
和CXX_FLAGS
变量,就像makefiles预期的那样。因此构建可以通过以下方式开始:型
或者通过设置相应的环境变量。
s3fp2yjn4#
另一种方法是使用文档中的CXXFLAGS环境变量。该环境变量用于初始化CMAKE_CXX_FLAGS缓存条目,因此需要在首次生成构建文件时使用它,如果您随后需要更改CXXFLAGS值,则需要重新生成构建文件。
例如:
字符串
xtfmy6hx5#
除非你有一个很好的理由不,否则你应该使用
ADD_DEFINITIONS(<name>=<value>[, ...])
。只需将以下一行添加到CMakeLists.txt中:
字符串
CMake将负责开关的语法(无论是
-D<name>=<value>
还是/D<name>=<value>
)。