gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:29:24 27 4
gpt4 key购买 nike

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

最佳答案

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 将尝试编译静态库而不是可执行文件,如 here 所述.这避免了运行链接器并用于交叉编译。
您可以设置 CMAKE_C_COMPILER_WORKS它将省略每个 here 的检查,但我觉得 CMAKE_TRY_COMPILE_TARGET_TYPE是更合适的解决方案。

关于gcc - CMake:C 编译器无法编译简单的测试程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com