我可以跳过cmake编译器测试或避免“错误:无法识别的选项'-rdynamic'”

时间:2012-05-15 10:42:34

标签: c cmake cross-compiling

针对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错误?

5 个答案:

答案 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跳过测试。