web-dev-qa-db-ja.com

C ++のCMakeコマンドライン#define

コンパイラスイッチを追加して、特定のプロジェクトの異なるバージョンをコンパイルする必要があります。通常、これを行うには、add_definitionsなどを使用します。

set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 )

cMakeLists.txtファイル内。

ただし、この特定のプロジェクトではCMakeLists.txtを含むソースの変更は許可されていませんファイル。

私はそのようなものを望んでいた

cmake -D_MYDEFINE=1 <path to sources>

プリプロセッサ定義に_MYDEFINE = 1を含むプロジェクトファイル(私の場合はVisual Studio 2008ですが、重要ではありません)が生成されますが、実際には生成されません。

ここに私のオプションは何ですか?これを達成するための別のcmakeコマンドラインオプションはありますか?プロジェクトのCMakeLists.txtを変更する必要がない限り、コマンドラインを含まないソリューションを提案してください。

30
Tim Meyer

私は今この方法でそれを行うことができました:

次の行を共通のCMakeLists.txtに追加するようにみんなを説得することができました。

IF (NOT DEFINED _MYDEFINE)
    SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})

(いいえ、それは実際には「MYDEFINE」と呼ばれているわけではなく、<デフォルト値>は単なるプレースホルダーです。この例ではすべてを置き換えました)

これは、追加のコンパイラフラグなしでコンパイルする現在の動作を変更しないため、有効な変更です。

そしてそれはあなたがすることを可能にします

cmake -D_MYDEFINE=<my value> <path to sources>

このcmake定義は、cmakeがプロジェクトファイルを作成するときにC++プリコンパイラー定義にマップされます。

25
Tim Meyer

コンテナ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>
10
Naszta

CMakeソースファイルを変更せずにC++またはCプリプロセッサ定義を渡すには、Cの場合は環境変数CFLAGSを、C++の場合はCXXFLAGSをそれぞれ使用します。次に例を示します。

$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..
1
sakra