Tim*_*yer 29 c++ command-line cmake
我需要通过添加编译器开关来编译某个项目的不同版本.通常我会通过使用add_definitions或类似的东西来做到这一点
set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 )
Run Code Online (Sandbox Code Playgroud)
在CMakeLists.txt文件中.
但是,在此特定项目中,我不允许修改任何源,包括CMakeLists.txt文件.
我希望有类似的东西
cmake -D_MYDEFINE=1 <path to sources>
Run Code Online (Sandbox Code Playgroud)
会生成一个项目文件(在我的情况下是Visual Studio 2008,但无关紧要),其预处理器定义中包含_MYDEFINE = 1,但实际上它不会.
我有什么选择?是否有不同的cmake命令行选项来实现此目的?只要不需要更改项目的CMakeLists.txt,就可以建议不包括命令行的解决方案.
Tim*_*yer 26
我现在设法这样做了:
我能够说服每个人将以下行添加到常见的CMakeLists.txt:
IF (NOT DEFINED _MYDEFINE)
SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})
Run Code Online (Sandbox Code Playgroud)
(不,它不是真的称为"MYDEFINE",<默认值>只是一个占位符,我只是替换了此示例中的所有内容)
这不会改变当前的编译行为,不会有额外的编译器标志,因此是有效的更改.
它允许你这样做
cmake -D_MYDEFINE=<my value> <path to sources>
Run Code Online (Sandbox Code Playgroud)
当cmake创建项目文件时,此cmake定义将映射到C++预编译器定义.
Nas*_*zta 11
容器CMakeLists.txt解决方案
棘手的解决方案:
您的只读CMakeList.txt路径:${path}/ReadOnlyProject/CMakeLists.txt
CMakeList.txt为只读库(${path}/CMakeLists.txt)创建一个新的to upper :
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
PROJECT (FAKE_PROJECT)
ADD_DEFINITIONS(-D_MYDEFINE=1)
ADD_SUBDIRECTORY(ReadOnlyProject)
Run Code Online (Sandbox Code Playgroud)
现在使用您的新项目(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>
Run Code Online (Sandbox Code Playgroud)
要在不修改任何 CMake 源文件的情况下传递 C++ 或 C 预处理器定义,请分别使用CFLAGSC 或CXXFLAGSC++的环境变量,例如:
$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..
Run Code Online (Sandbox Code Playgroud)