2016-08-23 165 views
4

我有一個CMakeLists.txt爲我的C++項目,在Windows上完美工作,使用MSVC,並在Linux上與gcc。我正在嘗試在Windows for Linux上使用相同的文件進行交叉編譯。CMake連接失敗

我使用Eclipse CDT4 - Unix Makefiles作爲生成器在Eclipse中創建make文件項目。爲了使用交叉編譯器我已經創建了下面的工具鏈文件

set(CMAKE_SYSTEM_NAME Linux) 

set(TOOL_CHAIN_ROOT "C:/mgc/embedded/codebench") 

# specify the cross compiler 
set(CMAKE_C_COMPILER ${TOOL_CHAIN_ROOT}/bin/x86_64-amd-linux-gnu-gcc.exe) 
set(CMAKE_CXX_COMPILER ${TOOL_CHAIN_ROOT}/bin/x86_64-amd-linux-gnu-g++.exe) 
set(_ECLIPSE_VERSION "4.5") 

,這是我如何生成項目文件

cmake -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=../Source/cross-tool.cmake ../Source` 

我沒有任何問題就在這裏。我甚至可以編譯源文件與

cmake --build . 

該項目開始編譯,但在當它試圖鏈接盡頭它失敗,此錯誤:

[100%] Linking CXX executable crossProject 
x86_64-amd-linux-gnu-g++.exe: error: CMakeFiles/crossProject.dir/Path/To/ObjectFile.cpp.o: No such file or directory 
make.exe[2]: *** [crossProject] Error 1 
make.exe[1]: *** [CMakeFiles/crossProject.dir/all] Error 2 
make.exe: *** [all] Error 2 

但是,當我檢查CMakeFiles/crossProject.dir我可以看到它抱怨找不到的對象文件。它就在那裏。

我一直在使用這個交叉編譯器一段時間,我相信它工作正常。我實際上使用與不帶CMake的Eclipse內部構建器相同的交叉編譯器構建相同的項目。所以這個問題不應該與交叉編譯器本身有關。

這是正常的,它使用x86_64-amd-linux-gnu-g++.exe鏈接而不是x86_64-amd-linux-gnu-ld.exe

回答

0

問題是Windows,而不是編譯器和CMake。您可以閱讀更多關於它的信息here,但其要點在於Windows命令行中有8192個字符限制。基本上你不能運行任何超過8192個字符的命令。 CMake試圖執行的鏈接命令有11353個字符,這就是爲什麼它會因爲這個錯誤而失敗。

解決方案是使用不同的shell。正如博客文章中提到的,您可以從sourceforge下載GNU ARM Eclipse Build Tools。

一旦下載並安裝,只需將make.exesh.exe<Installation-Path>/bin複製到任何您的工具鏈,並像老闆一樣鏈接!

我試過用不同的編譯器,qnx - gcc - cross gcc,它完美的工作。