web-dev-qa-db-fra.com

CMake: Le compilateur C n'est pas capable de compiler un programme de test simple

J'essaie de compiler de manière croisée le SDK C Azure IoT pour un processeur Mips. La compilation croisée d’une version antérieure du même SDK à l’aide d’une version antérieure de CMake (2.8.12.2) fonctionne très bien. Je doute donc que ce soit le code lui-même. Je devine que c'est le compilateur Mips GCC.

Message d'erreur:

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

Malheureusement, je suis coincé avec le compilateur Mips GCC que j'ai. Existe-t-il un moyen de désactiver cette vérification du programme de test?

La solution consistait à les ajouter au fichier chaîne d'outils:

SET (CMAKE_C_COMPILER_WORKS 1)
SET (CMAKE_CXX_COMPILER_WORKS 1)
13
Kagemand Andersen

cmake essaie de compiler un exécutable en utilisant les options du compilateur "standard" (selon ce que cmake considère comme standard) et essaie de l'exécuter afin de voir si le compilateur fonctionne. L'exécutable est simple, généralement comme int main(int argc) { return argc - 1; }.

Vous ne pouvez pas faire cela lors de la compilation croisée. Parce que généralement vous ne pouvez pas lier une bibliothèque C standard standard, vous n'avez ni printf, ni _start Ou _exit Ou similaire, en passant des arguments à main est défini par implémentation, ou vous avez besoin d'un script d'éditeur de liens ou vous ne pouvez pas exécuter de source compilée de manière croisée sur l'hôte, etc. Tout simplement: vous ne pouvez généralement pas exécuter d'exécutable compilé de manière croisée sur l'hôte et même la compilation est assez difficile à faire.

La solution courante consiste à définir avant project():

set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

Donc, cmake va essayer de compiler une bibliothèque statique et non un exécutable, par ici . Cela évite d'exécuter l'éditeur de liens et est destiné à la compilation croisée.

Vous pouvez définir CMAKE_C_COMPILER_WORKS Et le contrôle sera omis ici , mais j'estime que la CMAKE_TRY_COMPILE_TARGET_TYPE Est une solution plus appropriée.

11
Kamil Cuk