CMake: компилятор C не может скомпилировать простую тестовую программу

Я пытаюсь скомпилировать пакет SDK C для Azure IoT для процессора Mips. Кросс-компиляция более старой версии того же SDK с использованием более старой версии CMake (2.8.12.2) работает нормально, поэтому я сомневаюсь, что дело в самом коде. Я предполагаю, что это компилятор Mips GCC.

Сообщение об ошибке:

CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message):
  The C compiler

    "/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp

    Run Build Command:"/usr/bin/make" "cmTC_2cc84/fast"
    /usr/bin/make -f CMakeFiles/cmTC_2cc84.dir/build.make CMakeFiles/cmTC_2cc84.dir/build
    make[1]: Entering directory '/home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o
    /usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23    -o CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o   -c /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_2cc84
    /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2cc84.dir/link.txt --verbose=1
    /usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23      -rdynamic CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o  -o cmTC_2cc84 
    /usr/local/mipsisa32r2el/r23/lib/gcc/mipsisa32r2el-axis-linux-gnu/4.7.2/../../../../mipsisa32r2el-axis-linux-gnu/bin/ld: this linker was not configured to use sysroots
    collect2: error: ld returned 1 exit status
    CMakeFiles/cmTC_2cc84.dir/build.make:97: recipe for target 'cmTC_2cc84' failed
    make[1]: *** [cmTC_2cc84] Error 1
    make[1]: Leaving directory '/home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp'
    Makefile:126: recipe for target 'cmTC_2cc84/fast' failed
    make: *** [cmTC_2cc84/fast] Error 2

К сожалению, я застрял на имеющемся у меня компиляторе Mips GCC. Есть ли способ отключить эту проверку тестовой программы?

Решением было добавить их в файл цепочки инструментов:

SET (CMAKE_C_COMPILER_WORKS 1)
SET (CMAKE_CXX_COMPILER_WORKS 1)

"Есть ли способ отключить эту проверку тестовой программы?" - Да. Легко погуглить: stackoverflow.com/questions/10599038/…

Tsyvarev 05.12.2018 14:44

@Tsyvarev Проигнорировал это, потому что принятый ответ от 2012 года без полезного ответа, но внизу есть строка, которая, кажется, отключает его.

Kagemand Andersen 05.12.2018 14:53

Если в вашем последнем абзаце есть намерение ответить на ваш вопрос, то это неподходящее место для него: в Stack Overflow мы стараемся разделять сообщения вопрос и отвечать. Вместо этого вы можете ответить на него в ответ на сообщение: при переполнении стека самоответчик - это совершенно приемлемый.

Tsyvarev 05.12.2018 16:08

@Tsyvarev Я знаю, но подумал, что период 48 применим и к публикации, а не только к принятию. Также у кого-то может быть лучшее решение или просто одно с объяснением.

Kagemand Andersen 05.12.2018 16:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
4
63 818
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

CMake пытается скомпилировать исполняемый файл, используя «стандартные» (в соответствии с тем, что CMake считает стандартным) параметры компилятора и пытается запустить этот исполняемый файл, чтобы проверить, работает ли компилятор. Исполняемый файл просто наподобие int main(int argc, char *argv[]) { return argc - 1; }.

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

Распространенное решение - установить перед project():

set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

Таким образом, CMake попытается скомпилировать статическую библиотеку, а не исполняемый файл, как описано в документы cmake CMAKE_TRY_COMPILE_TARGET_TYPE. Это позволяет избежать запуска компоновщика и предназначено для кросс-компиляции.

Вы можете установить CMAKE_C_COMPILER_WORKS, и он пропустит проверку в CMakeTestCCompiler.cmake, но CMAKE_TRY_COMPILE_TARGET_TYPE - более подходящее решение.

Ах, тогда это имеет больше смысла. Думал, что это могло быть из-за того, что компилятор был из ~ 2016, но, да, если у него есть проблемы с линковкой библиотек C, это объяснило бы это. Спасибо!

Kagemand Andersen 05.12.2018 16:30

try_compile () не пытается выполнить программу, но установка CMAKE_TRY_COMPILE_TARGET_TYPE полезна, потому что вы можете избежать этапа компоновки, выполняемого CMakeTestCCompiler.cmake, поскольку вы не можете легко добавить какие-либо специальные флаги компоновщика, используемые CMakeLists.txt на этом этапе.

fdk1342 05.12.2018 23:51

в этом случае похоже, что --sysroot=/usr/local/mipsisa32r2el/r23 не является допустимой опцией компоновщика и вызывает сбой.

fdk1342 05.12.2018 23:52

Обратите внимание, что если вы установите для CMAKE_TRY_COMPILE_TARGET_TYPE значение STATIC_LIBRARY, CMAKE_SIZEOF_VOID_P не будет вычисляться / устанавливаться, от чего зависят многие сценарии CMake.

Diarrhio 24.01.2019 20:22

Получил эту ошибку после обновления до Ubuntu 18.04.2, ваше предложение решило ее, спасибо!

user10556443 20.02.2019 14:33

Привет. Просто голосование за ваш полезный комментарий здесь

WinEunuuchs2Unix 17.06.2021 01:58

Если вы используете CMake GUI, вы можете добавить логическую запись с именем

CMAKE_CXX_COMPILER_FORCED

затем установите значение True.

Это пропустит процесс проверки для этой сборки.

Что ж, эта проблема действительно раздражает, я столкнулся с этой проблемой в течение 2 дней, теперь у меня есть решение.

Позвольте мне сначала объяснить мою проблему

Когда я удаляю NDK и Cmake из Sdk folder и запускаю свое приложение, grable снова устанавливает NDK и Cmake. Только в этот раз приложение запускается, и при повторной попытке запуска я получаю эту ошибку The C Compiler is not able to compile a simple test program.

Раньше я использовал ndkVersion "22.0.7026061", затем перешел на этот ndkVersion "21.1.6352462", и ЭТО РАБОТАЛО.

Я думаю, что это проблема NDK, и большая часть ответов устарела, попробуйте это, я надеюсь, что это ПОМОЖЕТ.

Другие вопросы по теме