57

私は多くの調査を行ってきましたが、これに対する答えを見つけることができませんでした.CMakeを使用して、コンパイルしているターゲットアーキテクチャを確実に見つけるにはどうすればよいですか? 基本的に、qmake の QMAKE_TARGET.arch に相当します。

ほとんどの情報源は CMAKE_SYSTEM_PROCESSOR を示唆しているようですが、i386、x86_64、ppc、ppc64 のいずれでコンパイルしているかに関係なく、たとえば OS X では常に i386 が返されるため、これは悪い解決策です。

同様に、CMAKE_SIZEOF_VOID_P は、ターゲットではなく、システムのポインター サイズを示します。

CMAKE_OSX_ARCHITECTURES があることは理解していますが、設定されていない場合は空になる可能性があります。その場合、システムが可能なものにデフォルト設定されているようです。では、ターゲット アーキテクチャの情報を見つけるにはどうすればよいでしょうか。

特に OS X の場合、32、64、および Intel Universal をどのように区別できますか?

4

8 に答える 8

43

だから私は私の問題に対してかなり創造的な解決策を考案しました... CMakeにはターゲットアーキテクチャを検出する機能がまったくないようです。

これで、環境に応じて 、 などの記号が定義される__i386__ため、C でこれを簡単に実行できることがわかりました。__x86_64__幸いなことに、CMake には、configure 段階で任意の C ソース コード ファイルをコンパイルして実行する try_run 関数があります。

次に、一連の ifdef を使用し、アーキテクチャ名を文字列としてコンソールに書き込む小さなプログラムを作成できます。唯一の問題は、ホストとターゲット システムが同じ場合にのみ機能することです...バイナリをコンパイルすることはできますが、バイナリを実行して出力を確認することはできないため、クロス コンパイル中には機能しません。

ここからが興味深いところです。故意に壊れた C プログラムを作成することで、C プリプロセッサを利用して必要な情報を取得できます... ifdefs に基づいてアーキテクチャ名をコンソールに書き込むという元の概念を使用しますが、それを行う代わりに、単純に # を配置しますprintf 呼び出しの代わりにエラー プリプロセッサ ディレクティブを使用します。

CMake の try_run 関数が C ファイルをコンパイルするとき、コンパイルは常に失敗しますが、#error ディレクティブに配置したメッセージは、try_run が返すコンパイラのエラー出力に表示されます。

したがって、いくつかの CMake 文字列コマンドを使用して、コンパイラのエラー出力からアーキテクチャ名を解析するだけで、ターゲット アーキテクチャを取得できます...クロス コンパイル時でも。

コードの OS X 固有の部分は、主に CMAKE_OSX_ARCHITECTURES を使用してターゲット アーキテクチャを決定しますが、指定されていない場合は、他のシステムと同じコードを使用し、x86_64 (コンパイラのデフォルトである最新のシステムの場合) または i386 を正しく返します。 (Leopard などの古い OS X システムの場合)。

Visual Studio 9 および 10 ジェネレーター (x86、x86_64、ia64)、Xcode、NMake、MSYS Makefile、および Unix Makefile を使用して、これが Windows、OS X、および Linux で動作することをテストおよび検証しました。毎回正しい結果が返されます。

注意:このソリューションは、コンパイラに -m32 または -m64 を渡すなどのことを意図的に行った場合、またはターゲット アーキテクチャに影響を与える可能性のあるその他のフラグを実行した場合に失敗する可能性があります (すべての環境設定を try_run に渡す方法はありますか?)。これは私がテストしたものではありません。ジェネレーターのデフォルト設定を使用していて、すべてのターゲットが同じアーキテクチャー用にコンパイルされている限り、問題はありません。

私のソリューションの完全なソース コードは GitHub にあります: https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake

于 2012-08-19T04:26:59.653 に答える
0

今のところ、ターゲット アーキテクチャを決定するためのハックは必要ありません。ターゲットごとの変数 OSX_ARCHITECTURES が cmake に追加され、目的に使用できます: http://public.kitware.com/Bug/view.php?id= 8725

于 2014-10-24T09:25:18.030 に答える
-1

最も簡単で信頼性の高い解決策は、構築しているプラ​​ットフォーム用に手動でアーキテクチャを指定することだと思います (使用できるcmake . -DMY_ARCHITECTURE=x86ものなど)。上記で説明したのと同じ問題があるため、少なくともそれが私たちのプロジェクトで行っていることです

于 2012-08-14T11:50:04.157 に答える
-4

これは、ホスト アーキテクチャを知るための十分にテストされた方法です。

# Store in CMAKE_DEB_HOST_ARCH var the current build architecture
execute_process(COMMAND
  dpkg-architecture
    -qDEB_HOST_ARCH
  OUTPUT_VARIABLE
    CMAKE_DEB_HOST_ARCH
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

そして、後で必要に応じてその情報を CMakeLists で使用します

if(${CMAKE_DEB_HOST_ARCH} MATCHES "armhf")
  ...
elseif(${CMAKE_DEB_HOST_ARCH} MATCHES "i386")
  ...
else()
  ...
endif()
于 2016-12-01T10:04:13.903 に答える