2017-08-29 91 views
1

我想使用IAR編譯器。我注意到CMake的已經有一個關於該編譯器的一堆文件:如何在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 . 

它仍然會嘗試使用gcc,而不是我的IAR編譯器。爲什麼?

+0

請問的CMake的FAQ幫助這個項目嗎? https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F – vre

回答

2

要選擇一個特定的編譯器,你有幾種解決方案,如exaplained在CMake wiki

方法1:使用環境變量

對於C和C++,設置CCCXX環境變量。這種方法不能保證適用於所有的發電機。 (具體地,如果試圖設置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變量(S)轉換爲使用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(避免):使用組()

適當CMAKE_FOO_COMPILER變量(一個或多個),以在列表文件的有效編譯程序的名稱或全路徑使用set()設置。這必須在任何語言設置之前完成(即:在任何project()enable_language()命令之前)。 例如:

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

project("YourProjectName") 

維基不提供理由應避免第三屆方法...

+0

我不明白爲什麼應該避免使用第三種方法。使用第一種方法,用戶必須知道他想要使用的編譯器,但不應該這樣,因爲該項目只能使用指定的編譯器生成。有了第二個目標,用戶必須寫出很長的一行來配置項目。我寧願將方法2的命令放在bash文件中。這對我來說非常混亂。 – nowox

+0

三維方法的缺點是它**硬編碼**不僅是一個編譯器,而且還有一個**路徑**。或者需要用戶在PATH下編譯。在任何情況下,用戶應該知道使用哪個編譯器。 – Tsyvarev

+0

你可以傳遞編譯器的名字,而不需要設置它的完整路徑。在這種情況下,它在PATH env變量 – Antwane

1

如果你不想使用你的PC的標準編譯器,你必須給CMake編譯器的路徑。您可以通過環境變量,工具鏈文件或CMake命令行中的直接定義來執行此操作(請參閱,例如CMake Error at CMakeLists.txt:30 (project): No CMAKE_C_COMPILER could be found)。

將編譯器的名稱/路徑放入您的CMakeLists.txt文件中將會阻止您的項目跨平臺。

CMake通過編譯special C/C++ files來檢查編譯器ID。所以不需要手動包含從Module/CompilerModule/Platform

這將由CMake根據其編譯器和平臺檢查自動完成。

參考

+0

我還需要設置'CMAKE_C_COMPILER'還是有另一種方法?如果我做'cmake .',它仍然會嘗試使用'gcc' – nowox

+1

@nowox你必須給CMake編譯器的路徑。你可以通過環境變量,工具鏈文件或CMake命令行中的直接定義來實現這一點(參見例如[here](https://stackoverflow.com/questions/32801638/cmake-error-at-cmakelists-txt30-project-no -cmake-C編譯器,可待發現))。把它放到你的'CMakeLists.txt'中會阻止你的項目跨平臺。 – Florian

0

您可以致電cmake這樣的:

cmake -DCMAKE_C_COMPILER=iccarm ... 

cmake -DCMAKE_CXX_COMPILER=... 
0

您需要創建一個工具鏈文件,並使用CmakeForceCompiler m odule。

這裏是裸機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()作爲測試程序,並且您將得到錯誤「The C compiler」XXX「無法編譯一個簡單的測試程序。」這是因爲測試程序無法鏈接,因爲它沒有自定義鏈接程序文件(我假設裸機開發,因爲這是IAR通常使用的)。這一行告訴CMake使用add_library()來代替,這使得測試在沒有鏈接器文件的情況下成功。此變通辦法的來源:this CMake mailing list post

然後,假設你的工具鏈文件被命名爲IAR-toolchain.cmake,調用CMake的是這樣的:

cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake . 
+0

中搜索。開發人員如何知道它必須寫入'cmake -DCMAKE_TOOLCHAIN_FILE = iar-toolchain.cmake .'。在與GNU製作的傳統方式,開發商看到一個'Makefile'他打'make',這很簡單。隨着CMake的它看起來有點複雜:( – nowox

+1

你可以讓一個包裝腳本調用cmake的。我有一個名爲build.sh腳本,在我所有的項目 –

+1

我得到的根'的CMAKE_FORCE_C_COMPILER宏deprecated' – nowox