【发布时间】:2019-05-31 15:33:51
【问题描述】:
设置
我有以下文件。
empty.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
当我使用Line A(即target_link_libraries(${gtest_test} ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}))链接GTest 时,一切正常。但是当我使用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
问题
为什么使用一种链接方式会导致缺少标题,而另一种则可以正常工作?
【问题讨论】:
-
小笔记(与问题无关): 1.
CMAKE_SYSROOT变量中设置的目录自动 被视为CMAKE_FIND_ROOT_PATH列表中的一个;无需显式地将 sysroot 添加到CMAKE_FIND_ROOT_PATH列表中。 2.设置CMAKE_INSTALL_PREFIX一般不属于工具链。另请参阅设置默认安装前缀的模式:stackoverflow.com/questions/39481958/…。
标签: c++ cmake cross-compiling googletest