Я пытаюсь скомпилировать пакет 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)
@Tsyvarev Проигнорировал это, потому что принятый ответ от 2012 года без полезного ответа, но внизу есть строка, которая, кажется, отключает его.
Если в вашем последнем абзаце есть намерение ответить на ваш вопрос, то это неподходящее место для него: в Stack Overflow мы стараемся разделять сообщения вопрос и отвечать. Вместо этого вы можете ответить на него в ответ на сообщение: при переполнении стека самоответчик - это совершенно приемлемый.
@Tsyvarev Я знаю, но подумал, что период 48 применим и к публикации, а не только к принятию. Также у кого-то может быть лучшее решение или просто одно с объяснением.





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, это объяснило бы это. Спасибо!
try_compile () не пытается выполнить программу, но установка CMAKE_TRY_COMPILE_TARGET_TYPE полезна, потому что вы можете избежать этапа компоновки, выполняемого CMakeTestCCompiler.cmake, поскольку вы не можете легко добавить какие-либо специальные флаги компоновщика, используемые CMakeLists.txt на этом этапе.
в этом случае похоже, что --sysroot=/usr/local/mipsisa32r2el/r23 не является допустимой опцией компоновщика и вызывает сбой.
Обратите внимание, что если вы установите для CMAKE_TRY_COMPILE_TARGET_TYPE значение STATIC_LIBRARY, CMAKE_SIZEOF_VOID_P не будет вычисляться / устанавливаться, от чего зависят многие сценарии CMake.
Получил эту ошибку после обновления до Ubuntu 18.04.2, ваше предложение решило ее, спасибо!
Привет. Просто голосование за ваш полезный комментарий здесь
Если вы используете 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, и большая часть ответов устарела, попробуйте это, я надеюсь, что это ПОМОЖЕТ.
"Есть ли способ отключить эту проверку тестовой программы?" - Да. Легко погуглить: stackoverflow.com/questions/10599038/…