Вопрос по c, cmake – Могу ли я пропустить тесты компилятора cmake или избежать «ошибка: нераспознанная опция« -rdynamic »»

26

Параметры компиляции для cmake (в Windows) для целевой системы ARM, но когда я запускаю, настройте его, начиная тесты компилятора:

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. * Набор инструментов кросс-компиляции

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

Ваш Ответ

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

Это решило проблему для меня. Проблема с настройкой CMAKE_SHARED_LIBRARY_LINK_C_FLAGS заключается в том, что-rdynamic добавляется, даже когда мы просто связываем исполняемый файл без участия совместно используемых библиотек. Но смена имени системы на что-то отличное от Linux работало.
25

NONE на вашproject вызов:

project(<projectname> NONE)

но это может иметь довольно далеко идущие последствия. Для получения полной информации, запустите

cmake --help-command project

Я не знаком с ARM, так что это, вероятно, не лучший вариант для вас. Я полагаю, вам лучше посмотреть, есть ли способ исправить-rdynamic флаг.

EDIT:

Похоже, это былоидентифицировано как ошибка который по-прежнему остается нерешенным. В комментариях к сообщению об ошибке упоминается добавление следующих строк в качестве обходного пути (предположительно перед вашимproject вызов):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
так что yagarto - самый здравомыслящий компилятор, я не понимаю, почему «простая программа» запросите это специальное предложение Cynede
@Sholy - хорошо, вот мое последнее предположение :-) Попробуйте посмотреть наthis thread, но обратите внимание, что настройки должны быть выполнены доproject вызов.
@Sholy Я только что обновил ответ - надеюсь, это поможет вам.
честно говоря, он все еще пытается проверить ... но спасибо, я думаю, у меня достаточно информации для исследования. Cynede
Я вижу, но я получаю такой же вывод с этим, к сожалению :( Cynede
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

20

LANG & gt; _COMPILER_WORKS, например:

set(CMAKE_C_COMPILER_WORKS 1)

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

Вам также может понадобиться добавить соответствующий & quot; CMAKE_CXX_COMPILER_WORKS & quot; линия. Это сработало для меня в случае, когда для конкретной цели кросс-компиляции CMake настоял на использовании неверного пути к библиотеке и не смог связать исполняемый файл теста, но выбрал правильный путь для реальных сборок.

Похожие вопросы