我需要通过添加编译器开关来编译某个项目的不同版本。通常我会通过使用add_definitions或类似
之类的东西来做到这一点set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 )
在CMakeLists.txt文件中。
在此特定项目中,我不允许修改任何来源,包括CMakeLists.txt 文件。
我希望像
这样的东西cmake -D_MYDEFINE=1 <path to sources>
会生成一个项目文件(在我的情况下是Visual Studio 2008,但不应该重要),它在预处理器定义中包含_MYDEFINE = 1,但事实上它不会。
我有什么选择?是否有不同的cmake命令行选项来实现此目的?只要不需要更改项目的CMakeLists.txt,就可以建议不包括命令行的解决方案。
答案 0 :(得分:25)
我现在设法这样做了:
我能够说服每个人将以下行添加到常见的CMakeLists.txt中:
IF (NOT DEFINED _MYDEFINE)
SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})
(不,它不是真的称为“MYDEFINE”,而且&lt;默认值&gt;只是一个占位符,我只是替换了此示例中的所有内容)
这不会改变当前的编译行为,不会有额外的编译器标志,因此是有效的更改。
它允许你做
cmake -D_MYDEFINE=<my value> <path to sources>
当cmake创建项目文件时,此cmake定义将映射到C ++预编译器定义。
答案 1 :(得分:9)
容器CMakeLists.txt
解决方案
棘手的解决方案:
您的只读CMakeList.txt
路径:${path}/ReadOnlyProject/CMakeLists.txt
在只读库(CMakeList.txt
)的上方创建一个新的${path}/CMakeLists.txt
:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
PROJECT (FAKE_PROJECT)
ADD_DEFINITIONS(-D_MYDEFINE=1)
ADD_SUBDIRECTORY(ReadOnlyProject)
现在使用您的新项目(FAKE_PROJECT
)进行编译。如果ReadOnlyProject
没有直接设置编译器定义,它可以工作。
在Visual Studio 2010上:
尝试修改c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
以添加自定义编译器设置。
您应该添加以下内容:
<Project>
...
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
</Project>
答案 2 :(得分:1)
要通过C ++或C预处理程序定义而不修改任何CMake源文件,请分别对C使用环境变量CFLAGS
或对C ++使用环境变量CXXFLAGS
,例如:
$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..