2017-04-12 34 views
0

對於我的CMake項目,我希望構建庫的32位和64位版本,並使用CMake將它們安裝在正確的位置。爲什麼`project()`影響CMake對`CMAKE_SIZEOF_VOID_P`的意見?

但是,即使我使用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的文檔明確指出,它的值是「通過嘗試編譯確定的」,所以在調用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(嘆氣)... – thoni56

+0

歡迎來到*未定義的行爲*世界! :)我同意,在command-before-'project()'的情況下,行爲確實是** undefined **。 – Tsyvarev

+2

這裏似乎有一個重要的警告。雖然文檔指出'CMAKE_SIZEOF_VOID_P'是由「try compile」確定的,但似乎這個編譯不使用'CMAKE_C_FLAGS'。嘗試使用「-m32」,它仍然會說8(對於64位)。使用CMake 3.5.2在Ubuntu上進行測試。但是一個帶有短程序的'try_run'將使用'CMAKE_C_FLAGS'並返回4。 – thoni56

相關問題