2017-04-12 21 views
0

私のCMakeプロジェクトでは、32ビット版と64ビット版の両方のライブラリをビルドし、CMakeを使って正しい場所にインストールしたいと思っています。なぜ `project()`が `CMAKE_SIZEOF_VOID_P`のCMakeの意見に影響しますか?

しかし、GNUInstallDirsモジュールを使用しても、CMakeはライブラリを正しい場所にインストールしません。

私はproject()がvoid *のサイズに影響するという事実を追跡しましたが、これは非常に奇妙です。 (GNUInstallDirsは `CMAKE_SIZEOF_VOID_Pを使います。次CMakeLists.txtで

cmake_minimum_required(VERSION 3.7) 
if (CMAKE_SIZEOF_VOID_P EQUAL 8) 
    message (STATUS "CMake think we are compiling for 64-bit") 
else() 
    message (STATUS "CMake think we are compiling for something not 64-bit") 
endif() 

結果は "cmakeのは、私たちは、64ビット用にコンパイルされていると思います"。

しかし、私は最後に

project(x) 

を追加する場合、CMakeの出力は「cmakeのは、私たちがいない何かのために64ビットをコンパイルしていると思います」。

何がproject()でこれを変更していますか?どのように回避できますか?

答えて

1

project()を呼び出すと、ほとんどのコンパイラ関連のものが初期化されます。そのコールの前に、ほとんどすべてのCMakeコマンドと変数が期待どおりに動作しません。しかし、CMakeはそれに関するエラーを生成しません。

変数のドキュメントCMAKE_SIZEOF_VOID_P明示的には、その値は "try compileによって決定される"ので、project()コールが役に立たない前にチェックしてください:コンパイラがまだ設定されていません。

正しい使用法は次のようになります。

cmake_minimum_required(VERSION 3.7) 
project() # Initialize compiler-related stuff 
if (CMAKE_SIZEOF_VOID_P EQUAL 8) 
    message (STATUS "CMake think we are compiling for 64-bit") 
else() 
    message (STATUS "CMake think we are compiling for something not 64-bit") 
endif() 
+0

興味深い全く 'プロジェクトは、()'正しい答えを与えませんが、後半にそれを置くことは、間違った答えを与えることをけれども。 CMake(sigh)... – thoni56

+0

*未定義の動作*へようこそ! :)私は同意します。コマンド前の 'project()'の動​​作は本当に**未定義です**。 – Tsyvarev

+2

ここに重要な注意点があるようです。ドキュメントは 'CMAKE_SIZEOF_VOID_P'が" try compile "によって決定されると述べていますが、このコンパイルでは' CMAKE_C_FLAGS'は使われないようです。 "-m32"で試してください。それでも8(64ビット)と表示されます。これをUbuntuでCMake 3.5.2でテストしました。しかし、短いプログラムを持つ 'try_run'は' CMAKE_C_FLAGS'を使い、4を返します。 – thoni56

関連する問題