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

时间:2012-03-02 10:23:37

标签: c++ command-line cmake

我需要通过添加编译器开关来编译某个项目的不同版本。通常我会通过使用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,就可以建议不包括命令行的解决方案。

3 个答案:

答案 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 ..