CMake:C编译器无法编译简单的测试程序

zbwhf8kr  于 2023-01-30  发布在  其他
关注(0)|答案(4)|浏览(379)

我正在尝试交叉编译Azure IoT SDK C用于Mips处理器。使用旧版本的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

不幸的是,我被我的MipsGCC编译器卡住了。有没有办法禁用这个测试程序检查?
解决方案是将这些添加到工具链文件:

SET (CMAKE_C_COMPILER_WORKS 1)
SET (CMAKE_CXX_COMPILER_WORKS 1)
rkttyhzu

rkttyhzu1#

CMake尝试使用“标准”(按照CMake认为是标准的)编译器选项编译一个可执行文件,并尝试运行该可执行文件,以查看编译器是否工作。
交叉编译的时候不能这样做,因为通常不能链接到合适的C标准库,没有printf,或者_start,或者_exit之类的,给main传递参数是实现定义的,或者需要专门的链接器脚本,或者没有适合你架构的模拟器,所以不能在主机上运行交叉编译的源代码,等等......简单地说:您通常不能在主机上运行交叉编译的可执行文件,而且大多数时候甚至连编译都很难完成。
常见的解决方案是在project()之前设置:

set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")

因此CMake将尝试编译静态库而不是可执行文件,如cmake docs CMAKE_TRY_COMPILE_TARGET_TYPE中所述。这避免了运行链接器,并用于交叉编译。
您可以设置CMAKE_C_COMPILER_WORKS,它将省略CMakeTestCCompiler.cmake中的检查,但CMAKE_TRY_COMPILE_TARGET_TYPE是更合适的解决方案。

myzjeezk

myzjeezk2#

嗯,这个问题真的很烦人,我面对这个问题2天了,现在我得到了解决方案。
让我先解释我的问题
当我删除NDKCmakeSdk folder和运行我的应用程序,然后grable再次安装NDKCmake。只有那一次应用程序运行,当尝试再次运行我得到这个错误The C Compiler is not able to compile a simple test program
在我使用ndkVersion "22.0.7026061"之前,然后换成这个ndkVersion "21.1.6352462",它就工作了。
我认为这是NDK的问题,大部分的答案都过时了,试试这个,希望能有所帮助。

wkyowqbh

wkyowqbh3#

如果使用CMake GUI,则可以添加名为

CMAKE_CXX_COMPILER_FORCED

然后将其设置为True。
这将跳过此生成的检查过程。

hjzp0vay

hjzp0vay4#

在重新编译一个项目时遇到了同样的问题。原来编译器在此期间已经更新了。
删除build目录并重新创建后,编译完成,没有出现错误。

相关问题