gpt4 book ai didi

c++ - 交叉编译时CMake GTest fatal error (缺少stdlib.h)

转载 作者:行者123 更新时间:2023-11-30 04:47:00 26 4
gpt4 key购买 nike

设置

我有以下文件。

空.cc:

#include <cstdlib>

CMakeLists.txt:

set(CMAKE_MINIMUM_VERSION 3.8)

cmake_minimum_required(VERSION ${CMAKE_MINIMUM_VERSION})

find_package(GTest REQUIRED)

set(gtest_test gtest-test)
add_executable(${gtest_test} empty.cc)
#target_link_libraries(${gtest_test} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) # Line A
target_link_libraries(${gtest_test} GTest::GTest GTest::Main) # Line B

工具链.cmake:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 4.14.0)
set(CMAKE_SYSTEM_PROCESSOR arm)


set(CMAKE_C_COMPILER /opt/zynq/xtl/bin/arm-linux-musleabihf-gcc)
set(CMAKE_CXX_COMPILER /opt/zynq/xtl/bin/arm-linux-musleabihf-g++)

set(CMAKE_SYSROOT /opt/zynq/xtl/arm-linux-musleabihf)

set(CMAKE_FIND_ROOT_PATH /opt/zynq/xtl/arm-linux-musleabihf)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)


set(CMAKE_INSTALL_PREFIX /opt/zynq/xtl/arm-linux-musleabihf)

问题

我使用以下方法构建它:

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake .. && make VERBOSE=1 -j

当我使用 A 行 链接 GTest 时,即 target_link_libraries(${gtest_test} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) ,那么一切就OK了。但是当我使用 Line B,即 target_link_libraries(${gtest_test} GTest::GTest GTest::Main) 时,我遇到了以下错误:

/opt/zynq/xtl/bin/arm-linux-musleabihf-g++ --sysroot=/opt/zynq/xtl/arm-linux-musleabihf   -isystem /opt/zynq/xtl/arm-linux-musleabihf/include   -o CMakeFiles/gtest-test.dir/empty.cc.o -c /home/xxx/git/cmake/cmake-with-gtest/empty.cc
In file included from /home/xxx/git/cmake/cmake-with-gtest/empty.cc:1:
/opt/zynq/xtl/arm-linux-musleabihf/include/c++/8.3.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
#include_next <stdlib.h>
^~~~~~~~~~
compilation terminated.
CMakeFiles/gtest-test.dir/build.make:62: recipe for target
'CMakeFiles/gtest-test.dir/empty.cc.o' failed
make[2]: *** [CMakeFiles/gtest-test.dir/empty.cc.o] Error 1

g++ 版本

...$ /opt/zynq/xtl/bin/arm-linux-musleabihf-g++ --version
arm-linux-musleabihf-g++ (GCC) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

正常构建,即非交叉编译,使用任何一个都可以正常工作

target_link_libraries(${gtest_test} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) # Line A

target_link_libraries(${gtest_test} GTest::GTest GTest::Main) # Line B

问题

为什么使用一种链接方式会导致缺少 header ,而另一种方式却可以正常工作?

最佳答案

众所周知,对标准编译器使用 -isystem 包括目录中断 #include_next 指令,该指令广泛用于标准 C++ 头文件。参见例如这个问题:-isystem on a system include directory causes errors .

CMake 有一种过滤标准编译器包含目录的机制,它使用变量 CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES作为需要过滤掉的包含目录的列表。不幸的是,编译器无法自动检测到此列表(请参阅已关闭的错误报告:https://gitlab.kitware.com/cmake/cmake/issues/16291)。相反,目录 /usr/include(相对于 sysroot)只是添加到该列表中。

因为在你的工具链编译器中,include 目录不是 /usr/include 而是 /include,你需要明确地将这个目录添加到异常列表中:

# in toolchain.cmake
list(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES ${CMAKE_SYSROOT}/include)
# Setting the exclude directory for C compiler is optional:
# C standard headers rarely use `#include_next` directive
list(APPEND CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES ${CMAKE_SYSROOT}/include)

之间的区别

target_link_libraries(${gtest_test} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) # Line A

target_link_libraries(${gtest_test} GTest::GTest GTest::Main) # Line B

B 行 使用目标名称 进行链接,并且包含与该目标关联的目录会自动添加到您的可执行文件中。这就是您获得 -isystem 的原因。

第二种方式(Line B)被视为“现代”方式,建议在新编写的代码中使用。但这两种方法都应该有效。

关于c++ - 交叉编译时CMake GTest fatal error (缺少stdlib.h),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397962/

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