Могу ли я пропустить тесты компилятора cmake или избежать "ошибки: непризнанная опция" -rdynamic "

параметры компиляции cmake (в окнах) для целевой системы ARM, но когда я запускаю 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. * Кросс-компиляция toolchain

Как я могу пропустить эти тесты или исправить ошибку -rdynamic, которую я получаю?

Ответ 1

Вы можете пропустить проверку компилятора, добавив 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 "")

Ответ 2

Кажется, вы на самом деле нацелились на что-то еще, чем на 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) - это то, что вы на самом деле хотите сделать.

Ответ 3

Вы можете установить флаг CMAKE_ <LANG> _COMPILER_WORKS, например:

set(CMAKE_C_COMPILER_WORKS 1)

для подавления дальнейших проверок компилятора.