针对ARM目标系统的cmake(在Windows上)的编译选项,但是当我运行configure时,它开始编译器测试:
CMake Error at D:/Program Files/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
The C compiler "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" is not
able to compile a simple test program.
It fails with the following output:
Change Dir: D:/merge/complex/build/CMakeFiles/CMakeTmp
Run Build Command:D:/PROGRA~1/YAGART~1/bin/make.exe "cmTryCompileExec/fast"
D:/PROGRA~1/YAGART~1/bin/make.exe -f
CMakeFiles/cmTryCompileExec.dir/build.make
CMakeFiles/cmTryCompileExec.dir/build
make.exe[1]: Entering directory
`D:/merge/complex/build/CMakeFiles/CMakeTmp'
"D:/Program Files/CMake 2.8/bin/cmake.exe" -E cmake_progress_report
D:/merge/complex/build/CMakeFiles/CMakeTmp/CMakeFiles 1
Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o
"D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" -o
CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -c
D:/merge/complex/build/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTryCompileExec
"D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe"
"CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o" -o cmTryCompileExec
-rdynamic
arm-none-eabi-gcc.exe: error: unrecognized option '-rdynamic'
make.exe[1]: *** [cmTryCompileExec] Error 1
使用Yagatdo 4.6。*交叉编译工具链
如何跳过此测试或修复我得到的-rdynamic错误?
答案 0 :(得分:26)
您可以通过在NONE
电话中添加project
来跳过编译器检查:
project(<projectname> NONE)
但这可能会产生非常深远的影响。有关完整的详细信息,请运行
cmake --help-command project
我不熟悉ARM,所以这可能不是你最好的选择。我想你最好还是看看是否有办法修复-rdynamic
旗帜。
看起来这是identified as a bug,但实际上还没有解决。错误报告中的注释提到添加以下行作为解决方法(可能在您的project
调用之前):
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
答案 1 :(得分:23)
看起来你的目标实际上不是Linux,所以你应该告诉cmake你是在为一般情况进行交叉编译:
SET(CMAKE_SYSTEM_NAME Generic)
后跟(可选,但很好指定):
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)
但是,如果你指定(你可能会这样做,因为在网上很多例子中说明了这一点):
SET(CMAKE_SYSTEM_NAME Linux)
然后cmake将从(假设版本2.8)加载配置文件:
/usr/share/cmake-2.8/Modules/Platform/Linux.cmake
可能会加载:
/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake
此处-rdynamic
标志是出于历史原因设置的:
macro(__linux_compiler_gnu lang)
# We pass this for historical reasons. Projects may have
# executables that use dlopen but do not set ENABLE_EXPORTS.
set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-rdynamic")
endmacro()
而不是通过将NONE
指定为PROJECT
参数来确实禁用测试,而是设置CMAKE_SYSTEM_NAME
(除了Linux
以外的其他内容,例如Generic
)就是你真正想做的事情。
答案 2 :(得分:22)
你可以设置标志CMAKE_&lt; LANG&gt; _COMPILER_WORKS,例如:
set(CMAKE_C_COMPILER_WORKS 1)
禁止进一步的编译器检查。
答案 3 :(得分:1)
如果您只是在编译静态库,而又不想进行cmake测试以证明编译器可以生成二进制文件,则可以设置变量CMAKE_TRY_COMPILE_TARGET_TYPE
。
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
https://cmake.org/cmake/help/latest/variable/CMAKE_TRY_COMPILE_TARGET_TYPE.html
答案 4 :(得分:0)
在Windows交叉编译时,如果没有-rdynamic选项,则可以使用
-DCMAKE_SYSTEM_NAME="Windows"
用cmake。然后Cmake将使用-rdynamic跳过测试。