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)
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.