CMake:C 编译器无法编译简单的测试程序
CMake: The C Compiler is not able to compile a simple test program
我正在尝试为 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; }
.
交叉编译时不能这样做。因为通常你不能 link 使用适当的 C 标准库,你没有 printf
,或 _start
或 _exit
或类似的,将参数传递给 main
是实现定义的,或者你需要一个特殊的 linker 脚本,或者你的体系结构没有模拟器,所以不能 运行 在主机上交叉编译源,等等......简单: 你通常不能 运行 在主机上交叉编译的可执行文件,大多数时候连编译都很难做到。
常见的解决方法是在project()
之前设置:
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
这样 CMake 将尝试编译静态库而不是可执行文件,如 cmake docs CMAKE_TRY_COMPILE_TARGET_TYPE 中所述。这避免了 运行宁 linker 并且用于交叉编译。
您可以设置 CMAKE_C_COMPILER_WORKS
,它会忽略 CMakeTestCCompiler.cmake 中的检查,但 CMAKE_TRY_COMPILE_TARGET_TYPE
是更合适的解决方案。
如果使用 CMake GUI,您可以添加一个名为
的布尔条目
CMAKE_CXX_COMPILER_FORCED
然后将其设置为 True。
这将跳过此版本的检查过程。
好吧,这个问题真的很烦人,我遇到这个问题 2 天了,现在我找到了解决方案。
让我先解释一下我的问题
当我从 Sdk folder
和 运行 我的应用程序中删除 NDK
和 Cmake
时,然后 grable
安装 NDK
和 Cmake
再次。
只有那次应用程序 运行 和再次尝试 运行 时我收到此错误 The C Compiler is not able to compile a simple test program
.
在我使用 ndkVersion "22.0.7026061"
之前,然后更改为这个ndkVersion "21.1.6352462"
并且成功了。
我认为这是 NDK
问题,大部分答案都过时了试试这个我希望这会有所帮助。
我正在尝试为 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; }
.
交叉编译时不能这样做。因为通常你不能 link 使用适当的 C 标准库,你没有 printf
,或 _start
或 _exit
或类似的,将参数传递给 main
是实现定义的,或者你需要一个特殊的 linker 脚本,或者你的体系结构没有模拟器,所以不能 运行 在主机上交叉编译源,等等......简单: 你通常不能 运行 在主机上交叉编译的可执行文件,大多数时候连编译都很难做到。
常见的解决方法是在project()
之前设置:
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
这样 CMake 将尝试编译静态库而不是可执行文件,如 cmake docs CMAKE_TRY_COMPILE_TARGET_TYPE 中所述。这避免了 运行宁 linker 并且用于交叉编译。
您可以设置 CMAKE_C_COMPILER_WORKS
,它会忽略 CMakeTestCCompiler.cmake 中的检查,但 CMAKE_TRY_COMPILE_TARGET_TYPE
是更合适的解决方案。
如果使用 CMake GUI,您可以添加一个名为
的布尔条目CMAKE_CXX_COMPILER_FORCED
然后将其设置为 True。
这将跳过此版本的检查过程。
好吧,这个问题真的很烦人,我遇到这个问题 2 天了,现在我找到了解决方案。
让我先解释一下我的问题
当我从 Sdk folder
和 运行 我的应用程序中删除 NDK
和 Cmake
时,然后 grable
安装 NDK
和 Cmake
再次。
只有那次应用程序 运行 和再次尝试 运行 时我收到此错误 The C Compiler is not able to compile a simple test program
.
在我使用 ndkVersion "22.0.7026061"
之前,然后更改为这个ndkVersion "21.1.6352462"
并且成功了。
我认为这是 NDK
问题,大部分答案都过时了试试这个我希望这会有所帮助。