2016-08-23 210 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,它完美的工作。