CMake: компилятор C не может скомпилировать простую тестовую программу - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь выполнить кросс-компиляцию Azure IoT SDK C для процессора 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)

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Переустановка cmake решает ту же проблему

0 голосов
/ 05 декабря 2018

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

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

Распространенным решением является установка перед project():

set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

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

Вы можете установить CMAKE_C_COMPILER_WORKS, и он пропустит проверку по здесь , но я чувствую, что CMAKE_TRY_COMPILE_TARGET_TYPE более правильнорешение.

...