web-dev-qa-db-ja.com

CMake:Cコンパイラは単純なテストプログラムをコンパイルできません

Mipsプロセッサ用にAzure IoT SDK Cをクロスコンパイルしようとしています。 CMakeの古いバージョン(2.8.12.2)を使用して同じSDKの古いバージョンをクロスコンパイルすることは問題なく機能するため、コードそのものではないでしょう。 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)
13

cmakeは、「標準」(cmakeが標準だと考える)コンパイラオプションを使用して実行可能ファイルをコンパイルし、その実行可能ファイルを実行して、コンパイラが動作しているかどうかを確認します。実行可能ファイルは、通常int main(int argc) { return argc - 1; }のように単純です。

クロスコンパイルするときはできません。通常、適切な標準Cライブラリをリンクできないため、printf、または_startまたは_exitなどがなく、mainに引数を渡すことは実装定義です、またはリンカスクリプトが必要な場合、またはホストでクロスコンパイルされたソースを実行できない、など...単純に:通常、ホストでクロスコンパイルされた実行可能ファイルを実行することはできず、ほとんどの場合、コンパイルも困難です行う。

一般的な解決策は、project()の前に設定することです。

set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

そのため、cmakeは here ごとに実行可能ファイルではなく静的ライブラリをコンパイルしようとします。これにより、リンカの実行が回避され、クロスコンパイルが意図されています。

CMAKE_C_COMPILER_WORKSを設定すると、 here ごとのチェックが省略されますが、CMAKE_TRY_COMPILE_TARGET_TYPEがより適切なソリューションであると感じています。

11
Kamil Cuk