【问题标题】:CMake: The C Compiler is not able to compile a simple test programCMake:C 编译器无法编译简单的测试程序
【发布时间】:2025-11-25 18:40:01
【问题描述】:

我正在尝试为 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)

【问题讨论】:

  • "有没有办法禁用这个测试程序检查?" - 是的。轻松谷歌搜索:*.com/questions/10599038/…
  • @Tsyvarev 忽略它,因为接受的答案来自 2012 年,没有可用的答案,但在底部有一行似乎禁用它。
  • 如果你的最后一段有意图回答你的问题,那么它不适合它:在 Stack Overflow 上,我们倾向于将 questionanswer分开> 帖子。相反,您可以在 answer post 中回答:在 Stack Overflow 上 self-answeringperfectly acceptible
  • @Tsyvarev 我知道,但我认为 48 期也适用于发布它,而不仅仅是接受它。也有人可能有更好的解决方案,或者只是一个解释。

标签: gcc cmake mips cross-compiling


【解决方案1】:

CMake 尝试使用“标准”(根据 CMake 认为是标准的)编译器选项编译可执行文件,并尝试运行该可执行文件,以查看编译器是否正常工作。可执行文件is simple 类似于int main(int argc, char *argv[]) { return argc - 1; }

交叉编译时不能这样做。因为通常你不能链接到适当的 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是一个更合适的解决方案。

【讨论】:

  • 啊,这样更有意义。认为这可能是因为编译器是从 ~2016 年开始的,但是,是的,如果它无法链接 C 库来解释它。谢谢!
  • try_compile() 不会尝试执行程序,但设置 CMAKE_TRY_COMPILE_TARGET_TYPE 很有用,因为您可以避免 CMakeTestCCompiler.cmake 执行的链接步骤,因为您无法轻松添加任何特殊的链接器标志此时CMakeLists.txt
  • 在这种情况下,--sysroot=/usr/local/mipsisa32r2el/r23 似乎不是一个有效的链接器选项并导致失败。
  • 请注意,如果您将 CMAKE_TRY_COMPILE_TARGET_TYPE 设置为 STATIC_LIBRARY,则不会计算/设置 CMAKE_SIZEOF_VOID_P,这是许多 CMake 脚本所依赖的。
  • 升级到 Ubuntu 18.04.2 后出现此错误,您的建议解决了,谢谢!
【解决方案2】:

这个问题真的很烦人,我遇到这个问题两天了,现在我得到了解决方案。

让我先解释一下我的问题

当我从Sdk folder 中删除NDK Cmake 并运行我的应用程序然后grable 再次安装NDKCmake。 只有那一次应用程序运行,当尝试再次运行时,我收到此错误The C Compiler is not able to compile a simple test program

在我使用 ndkVersion "22.0.7026061" 之前,然后更改为 thisndkVersion "21.1.6352462" 并且它可以工作。

我认为这是NDK 的问题,大多数答案都已过时,试试这个我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    如果使用 CMake GUI,您可以添加一个名为

    的布尔条目
    CMAKE_CXX_COMPILER_FORCED
    

    然后将其设置为 True。

    这将跳过此构建的检查过程。

    【讨论】: