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

cnd*_*cnd 26 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
Run Code Online (Sandbox Code Playgroud)

使用Yagatdo 4.6.*交叉编译工具链

如何跳过此测试或修复我得到的-dynamic错误?

Fra*_*ser 26

您可以通过添加NONE到您的project呼叫来跳过编译器检查:

project(<projectname> NONE)
Run Code Online (Sandbox Code Playgroud)

但这可能会产生非常深远的影响.有关详细信息,请运行

cmake --help-command project
Run Code Online (Sandbox Code Playgroud)

我不熟悉ARM,所以这可能不是你最好的选择.我想你会更好地看看是否有办法解决这个问题-rdynamic.

编辑:

看起来这被认为是一个有效仍未解决的错误.错误报告中的注释提到添加以下行作为解决方法(可能在您的project调用之前):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
Run Code Online (Sandbox Code Playgroud)


Ann*_*sum 23

看起来你的目标实际上不是Linux,所以你应该告诉cmake你正在为通用案例进行交叉编译:

SET(CMAKE_SYSTEM_NAME Generic)
Run Code Online (Sandbox Code Playgroud)

接下来(可选,但很好指定):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)
Run Code Online (Sandbox Code Playgroud)

但是,如果你指定(你可能会这样做,因为在网上很多例子中说明了这一点):

SET(CMAKE_SYSTEM_NAME Linux)
Run Code Online (Sandbox Code Playgroud)

然后cmake将从(假设版本2.8)加载配置文件文件:

/usr/share/cmake-2.8/Modules/Platform/Linux.cmake
Run Code Online (Sandbox Code Playgroud)

从中可能加载:

/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake
Run Code Online (Sandbox Code Playgroud)

这里的-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()
Run Code Online (Sandbox Code Playgroud)

确实通过指定NONEPROJECT参数来完成禁用测试,而不是设置CMAKE_SYSTEM_NAME(Linux例如,除了之外的其他东西Generic)是你真正想要做的事情.


adi*_*iog 23

您可以设置标志CMAKE_ <LANG> _COMPILER_WORKS,例如:

set(CMAKE_C_COMPILER_WORKS 1)
Run Code Online (Sandbox Code Playgroud)

抑制进一步的编译器检查.

  • 您可能还需要添加匹配的“ CMAKE_CXX_COMPILER_WORKS”行。对于特定的交叉编译目标CMake坚持使用错误的库路径并且未能链接测试可执行文件,但为实际构建选择了正确的路径时,这对我有用。 (2认同)

awe*_*kie 5

如果你只是编译一个静态库,并且你想避免让 CMake 测试编译器可以生成二进制文件,你可以设置变量CMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
Run Code Online (Sandbox Code Playgroud)