37

用于 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 错误?

4

5 回答 5

38

您可以设置CMAKE_<LANG>_COMPILER_WORKS为 true 以禁止对该语言进行进一步的编译器检查。

set(CMAKE_C_COMPILER_WORKS 1)
于 2015-06-04T11:02:03.763 回答
34

NONE您可以通过添加到您的project调用跳过编译器检查:

project(<projectname> NONE)

但这会产生相当深远的影响。有关完整详细信息,请运行

cmake --help-command project

我不熟悉 ARM,所以这可能不是你最好的选择。我想你最好看看是否有办法修复-rdynamic标志。

编辑:

看起来这被确定为一个实际上仍未解决的错误。错误报告中的评论提到添加以下行作为解决方法(大概在您project致电之前):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
于 2012-05-15T11:08:33.607 回答
28

看来您实际上的目标不是 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()

而不是通过指定NONEPROJECT参数来禁用测试,似乎将CMAKE_SYSTEM_NAME( 设置为其他东西Linux,例如Generic) 是您真正想要做的。

于 2014-07-18T14:56:49.210 回答
6

如果您只是在编译静态库,并且希望避免让 CMake 测试编译器可以生成二进制文件,则可以设置变量CMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
于 2019-02-22T10:19:54.170 回答
0

在没有 -rdynamic 选项的 Windows 交叉编译时,您可以使用

-DCMAKE_SYSTEM_NAME="Windows"

与 cmake。然后 Cmake 将使用 -rdynamic 跳过测试。

于 2020-09-15T11:10:41.377 回答