用于C++ #define的CMake命令行

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)


sak*_*kra 5

要在不修改任何 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)