web-dev-qa-db-ja.com

CMakeでコンパイラを指定する方法は?

IARコンパイラを使用したいと思います。 CMakeにはすでにこのコンパイラーに関するたくさんのファイルがあることに気づきました:

https://github.com/jevinskie/cmake/blob/master/Modules/Compiler/IAR.cmake

私が読んだ一般的な解決策から、CMakeLists.txtのすべてのツールチェーンを手動で指定することができます:

set(CMAKE_C_COMPILER iccarm)
set(CMAKE_CPP_COMPILER iccarm)

CMakeがこれらの定義を「モジュール/コンパイラ/IAR.cmake」にリンクする方法を教えてください。

やらなきゃいけないと思った

include("Modules/Compiler/IAR.cmake")

IARコンパイラを指定する正しい方法は何ですか?

私がする時

cmake .

それでも、IARコンパイラの代わりにgccを使用しようとします。どうして?

10
nowox

CMake wiki で説明されているように、特定のコンパイラを選択するには、いくつかの解決策があります。

方法1:環境変数を使用する

CおよびC++の場合、CCおよびCXX環境変数を設定します。このメソッドは、すべてのジェネレーターで機能するとは限りません。 (具体的には、Xcodeの_GCC_VERSION_を設定しようとすると、このメソッドはXcodeを混乱させます。)次に例を示します。

_CC=gcc-4.2 CXX=/usr/bin/g++-4.2 cmake -G "Your Generator" path/to/your/source
_

方法2:cmake -Dを使用します

_CMAKE_FOO_COMPILER_を使用して、コマンドラインで適切な_cmake -D_変数を有効なコンパイラ名またはフルパスに設定します。例えば:

_cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source
_

方法3(回避):set()を使用します

set()を使用して、リストファイル内の適切な_CMAKE_FOO_COMPILER_変数を有効なコンパイラ名またはフルパスに設定します。これは、言語が設定される前(つまり、project()またはenable_language()コマンドの前)に行う必要があります。例えば:

_set(CMAKE_C_COMPILER "gcc-4.2")
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.2")

project("YourProjectName")
_

Wikiは、3番目の方法を避けるべき理由を提供していません...

7
Antwane

PCの標準コンパイラを使用したくない場合は、CMakeにコンパイラへのパスを与える必要があります。これを行うには、環境変数、ツールチェーンファイル、またはCMakeコマンドラインの直接定義を使用します(例 CMakeLists.txt:30(プロジェクト)でのCMakeエラー:CMAKE_C_COMPILERが見つかりませんでした を参照)。

コンパイラの名前/パスをCMakeLists.txtに入れると、プロジェクトがクロスプラットフォームになるのを防ぎます。

CMakeは 特別なC/C++ファイル をコンパイルして、コンパイラIDをチェックします。そのため、Module/CompilerまたはModule/Platformから手動で含める必要はありません。

これは、コンパイラとプラットフォームのチェックに基づいてCMakeによって自動的に行われます。

参照

1
Florian

次のようにcmakeを呼び出すことができます。

cmake -DCMAKE_C_COMPILER=iccarm ...

または

cmake -DCMAKE_CXX_COMPILER=...
1
robert

ツールチェーンファイルを作成し、CmakeForceCompilerモジュールを使用する必要があります。

以下は、ベアメタルのツールチェーンファイルの例ですARM IARを使用した開発:

include(CMakeForceCompiler)

set(CMAKE_SYSTEM_NAME Generic) # Or name of your OS if you have one
set(CMAKE_SYSTEM_PROCESSOR arm) # Or whatever
set(CMAKE_CROSSCOMPILING 1)

set(CMAKE_C_COMPILER iccarm) # Change the arm suffix if appropriate
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Required to make the previous line work for a target that requires a custom linker file

最後の行が必要なのは、CMakeがコンパイラーでテストプログラムをコンパイルして、機能することを確認し、プリプロセッサー定義からいくつかのバージョン情報を取得しようとするためです。この行がないと、CMakeはテストプログラムにadd_executable()を使用し、「Cコンパイラ "XXX"は単純なテストプログラムをコンパイルできません。」というエラーが発生します。これは、カスタムリンカーファイルがないため、テストプログラムがリンクに失敗するためです(これは、IARが通常使用されるため、ベアメタル開発を想定しています)。この行は、CMakeに代わりにadd_library()を使用するように指示します。これにより、リンカーファイルなしでテストが成功します。この回避策のソース: このCMakeメーリングリストの投稿

次に、ツールチェーンファイルの名前がiar-toolchain.cmakeであると想定して、次のようにCMakeを呼び出します。

cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake .
0
Samuel Peter