Can I skip cmake compiler tests or avoid “error: u

2020-05-20 07:44发布

compilation options for cmake (on windows) for ARM target system but when I run configure it's starting compiler tests:

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

Using Yagatdo 4.6.* cross-compilation toolchain

How can I skip this tests or fix -rdynamic error that I am getting?

4条回答
混吃等死
2楼-- · 2020-05-20 08:09

You can skip the compiler checks by adding NONE to your project call:

project(<projectname> NONE)

but this can have pretty far-reaching effects. For full details, run

cmake --help-command project

I'm not familiar with ARM, so this is probably not your best option here. I guess you'd be better to see if there's a way to fix the -rdynamic flag.

EDIT:

It looks like this was identified as a bug which is effectively still unresolved. The comments in the bug report mention adding the following lines as a workaround (presumably before your project call):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
查看更多
太酷不给撩
3楼-- · 2020-05-20 08:10

If you're just compiling a static library and you want to avoid having CMake test that the compiler can generate binaries, you can set the variable CMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
查看更多
三岁会撩人
4楼-- · 2020-05-20 08:18

It seems you target actually something else than Linux, so you should tell cmake that you are cross-compiling for the generic case:

SET(CMAKE_SYSTEM_NAME Generic)

Followed by (optionally, but nice to specify):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)

However, if you specify (which you likely did because this is stated in a lot of examples online):

SET(CMAKE_SYSTEM_NAME Linux)

Then cmake will load the configuration files from (suppose version 2.8) the file:

/usr/share/cmake-2.8/Modules/Platform/Linux.cmake

from which it is likely to load:

/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake

Here the -rdynamic flag is set for historical reasons:

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()

Rather than disabling the tests as indeed is done by specifying NONE as the PROJECT argument, it seems setting the CMAKE_SYSTEM_NAME (to something else than Linux, for instance Generic) is what you actually want to do.

查看更多
不美不萌又怎样
5楼-- · 2020-05-20 08:21

You can set CMAKE_<LANG>_COMPILER_WORKS to true to suppress further compiler checks for that language.

set(CMAKE_C_COMPILER_WORKS 1)
查看更多
登录 后发表回答