Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交叉编译时发生CMake GTest致命错误(缺少stdlib.h) 组织_C++_Cmake_Cross Compiling_Googletest - Fatal编程技术网

C++ 交叉编译时发生CMake GTest致命错误(缺少stdlib.h) 组织

C++ 交叉编译时发生CMake GTest致命错误(缺少stdlib.h) 组织,c++,cmake,cross-compiling,googletest,C++,Cmake,Cross Compiling,Googletest,我有以下文件 empty.cc: toolchain.cmake: 问题 我使用以下方法构建它: cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake .. && make VERBOSE=1 -j 当我使用行A链接GTest,即目标链接库(${GTest\u test}${GTest\u libraries}${GTest\u MAIN\u libraries})时,一切都正常。但是当我使用行B,即目标链接库(${gtest\u te

我有以下文件

empty.cc: toolchain.cmake: 问题 我使用以下方法构建它:

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake .. && make VERBOSE=1 -j
当我使用
行A
链接
GTest
,即
目标链接库(${GTest\u test}${GTest\u libraries}${GTest\u MAIN\u libraries})
时,一切都正常。但是当我使用
行B
,即
目标链接库(${gtest\u 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
正常构建,即不交叉编译,使用以下两种方法都可以很好地工作

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

问题:

为什么使用一种链接的方式导致缺失的标题,而其他的工作却很好?

< P>众所周知,使用标准代码> <代码>系统>代码>包括目录中断<代码>包含在标准C++头文件中广泛使用的NeX/NoX>代码。例如,请参见以下问题:

CMake有一种过滤标准编译器包含目录的机制,它使用变量作为需要过滤掉的包含目录的列表。不幸的是,编译器无法自动检测到此列表(请参阅关闭的bugreport:)。相反,目录
/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

是指
行B
使用目标名称进行链接,并包括与目标关联的目录,这些目录将自动添加到可执行文件中。这就是为什么您得到了
-isystem


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

小注释(与问题无关):1。
CMAKE\u SYSROOT
变量中设置的目录将自动视为
CMAKE\u FIND\u ROOT\u PATH
列表中的目录;无需明确地将sysroot添加到
CMAKE\u FIND\u ROOT\u PATH
列表中。2.设置
CMAKE\u INSTALL\u前缀通常不是工具链的一部分。另请参阅设置默认安装前缀的模式:。嗯。。。它不起作用。我没有提到,但我在
/opt/zynq/xtl/arm-linux-musleabihf
中有
usr
指向这个目录,即
usr->。
。因此,如果与
/opt/zynq/xtl/arm-linux-musleabihf/usr/include有效相同,则
/opt/zynq/xtl/arm-linux-musleabihf/usr/include
...$ /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
# 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