2017-03-08 45 views
2

我想通過CMAKE使用CMAKE在Windows中運行Arduino編譯器。我創建了一個.cmake文件,可以找到並覆蓋一些工具鏈變量,如CMAKE_C_COMPILER。這對Linux很有用。一切都在發現和建立。在Linux中,我使用UNIX Makefiles生成器。如何更改C編譯器而不是以cl.exe開關結束?

但是,當我回到Windows時,我遇到了問題。我想讓NMake和Visual Studio生成器都能正常工作。如果讓我選一個,我會去與最不復雜(NMAKE)

  • 的NMAKE生成器上添加命令行開關堅持爲cl.exe時(/ NOLOGO,/ DWIN32等),這些創建錯誤,停止構建。

  • NMake生成器確實使用arduino編譯器的路徑。 (好)

  • 在Visual Studio生成堅持使用cl.exe時(差)和它把進入命令行開關cl.exe時(壞)

如何阻止它加入cl.exe命令行切換?

的代碼看起來是這樣的:

set(TOOLCHAIN_ROOT "C:\Program Files (x86)\Arduino\hardware\tools\arm") 

if(WIN32) 
    set(TOOL_OS_SUFFIX .exe) 
else(WIN32) 
    set(TOOL_OS_SUFFIX) 
endif(WIN32) 

set(CMAKE_SYSTEM_NAME Generic) 
set(CMAKE_SYSTEM_PROCESSOR arm) 
set(CMAKE_CROSSCOMPILING 1) 

set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-gcc${TOOL_OS_SUFFIX}") 
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-g++${TOOL_OS_SUFFIX}") 
set(CMAKE_AR "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-ar${TOOL_OS_SUFFIX}") 
set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-ld${TOOL_OS_SUFFIX}") 
set(CMAKE_NM "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-nm${TOOL_OS_SUFFIX}") 
set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-objcopy${TOOL_OS_SUFFIX}") 
set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-objdump${TOOL_OS_SUFFIX}") 
set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-strip${TOOL_OS_SUFFIX}") 
set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-ranlib${TOOL_OS_SUFFIX}") 

這裏是輸出的樣子:

Scanning dependencies of target MyProject 
[ 2%] Building C object CMakeFiles/MyProject.dir/main.c.obj 
arm-none-eabi-gcc.exe: error: /nologo: No such file or directory 
arm-none-eabi-gcc.exe: error: /DWIN32: No such file or directory 
arm-none-eabi-gcc.exe: error: /D_WINDOWS: No such file or directory 
arm-none-eabi-gcc.exe: error: /W3: No such file or directory 
arm-none-eabi-gcc.exe: error: /D_DEBUG: No such file or directory 
arm-none-eabi-gcc.exe: error: /MDd: No such file or directory 
arm-none-eabi-gcc.exe: error: /Zi: No such file or directory 
arm-none-eabi-gcc.exe: error: /Ob0: No such file or directory 
arm-none-eabi-gcc.exe: error: /Od: No such file or directory 
arm-none-eabi-gcc.exe: error: /RTC1: No such file or directory 
arm-none-eabi-gcc.exe: error: /FoCMakeFilesMyProject.dirmain.c.obj: No such file or directory 
arm-none-eabi-gcc.exe: error: /FdCMakeFilesMyProject.dir -c: No such 
file or directory 
arm-none-eabi-gcc.exe: error: D:projectsexamplecode.c: No such file or directory 
arm-none-eabi-gcc.exe: fatal error: no input files 
compilation terminated. 
+0

如何'cmake'與Visual Studio生成** ** indentify你的編譯器?通常,手動設置編譯器時,您需要通過[CMAKE_C_COMPILER_ID](https://cmake.org/cmake/help/v3.0/variable/CMAKE_LANG_COMPILER_ID.html)變量設置其標識符。 – Tsyvarev

+0

另外,變量'CMAKE_CROSSCOMPILING'由CMake **自動設置**,不需要手動設置。 – Tsyvarev

+0

您不能只更改Visual Studio的編譯器。它需要安裝一個額外的插件或工具集(這需要CMake意識或需要CMake支持)。剛剛發佈的Visual Studio 2017對Linux系統有一些內置支持,並且已經有[一些查詢](https://cmake.org/pipermail/cmake/2016-October/064369.html)支持這些項目類型通過CMake,但我認爲[還沒有實現](https://github.com/Kitware/CMake/blob/master/Source/cmVisualStudio10TargetGenerator.cxx#L3505)。 – Florian

回答

0

談到我的意見爲答案

我已經安裝了Arduino Software (IDE) for Windows PCs版本1.8.1,並試用了我的Visual Studio 2 015社區版安裝。

這裏是我的測試代碼(但也許你只是在互聯網上搜索一些準備使用的工具鏈):

toolchain.txt

set(TOOLCHAIN_ROOT "C:/Program Files (x86)/Arduino/hardware/tools/avr") 

if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") 
    set(TOOL_OS_SUFFIX ".exe") 
else() 
    set(TOOL_OS_SUFFIX "") 
endif() 

set(CMAKE_SYSTEM_NAME Generic) 
set(CMAKE_SYSTEM_PROCESSOR avr) 

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 

set(TRIPLE avr) 
set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-gcc${TOOL_OS_SUFFIX}") 
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/bin/${TRIPLE}-g++${TOOL_OS_SUFFIX}") 

由於尚未下載來與一個arm編譯器工具鏈,我用的是avr(應該是可以替換的)。而且您不必提供所有工具,CMake會根據編譯器的命名方案找到它們。

而且 - 由於@Tsyvarev評論 - 變量CMAKE_CROSSCOMPILING由CMake自動設置,不需要手動設置它。


這裏是你可以/不能用Arduino的一個徹頭徹尾的現成的Visual Studio做什麼:

  1. 對於nmake我在CMD提示符下運行:

    > "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" 
    > mkdir NMake 
    > cd NMake 
    > NMake>cmake -G "NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE:PATH=..\toolchain.txt .. 
    -- The C compiler identification is GNU 4.9.2 
    -- The CXX compiler identification is GNU 4.9.2 
    -- Check for working C compiler: C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avr-gcc.exe 
    -- Check for working C compiler: C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avr-gcc.exe -- works 
    -- Detecting C compiler ABI info 
    -- Detecting C compiler ABI info - done 
    -- Detecting C compile features 
    -- Detecting C compile features - done 
    -- Check for working CXX compiler: C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avr-g++.exe 
    -- Check for working CXX compiler: C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avr-g++.exe -- works 
    -- Detecting CXX compiler ABI info 
    -- Detecting CXX compiler ABI info - done 
    -- Detecting CXX compile features 
    -- Detecting CXX compile features - done 
    -- Configuring done 
    -- Generating done 
    
  2. 對於Visual Studio,您不能只更改編譯器。它需要安裝一個額外的插件或工具集(這需要CMake意識或需要CMake支持)。剛剛發佈的Visual Studio 2017對Linux系統有一些內置的支持,但我認爲還沒有實現。

參考

相關問題