【发布时间】:2020-12-15 11:33:57
【问题描述】:
我正在尝试在我的 Linux Ubuntu 18.04 WSL 上为 Raspberry Pi 交叉编译一个项目。我已经通过sudo apt install gcc-arm-linux-gnueabihf 安装了工具链,所以它位于/usr/bin/ 之下。
现在在我的 CMake 文件中,我设置了以下内容:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(SYSROOT "${CMAKE_CURRENT_SOURCE_DIR}/../raspi_root")
set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")
set(CMAKE_SYSROOT ${SYSROOT})
set(CMAKE_FIND_ROOT_PATH ${SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
raspi_root 是我从 pi 复制到 WSL 的 RaspberryPi 根文件系统的位置。
CMakeLists.txt 然后以这种方式继续:
set(project_target Project)
project(${project_target})
set(SOURCES
main.cpp
<All my other sources>
)
add_executable(${project_target} ${SOURCES})
find_package(Boost COMPONENTS atomic thread system chrono REQUIRED)
find_library(ALLOTHERLIBS otherlibs REQUIRED)
target_include_directories(${project_target} PUBLIC
${BOOST_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${SYSROOT}/usr/include
${SYSROOT}/usr/include/arm-linux-gnueabihf
)
target_link_libraries(${project_target} PUBLIC
${Boost_LIBRARIES}
${ALLOTHERLIBS}
)
现在我做cmake MakeFile 生成并且(几乎)*一切都成功了。但是,在执行make 时,我收到以下错误消息:
make[2]: *** No rule to make target '../raspi_root/usr/lib/arm-linux-gnueabihf/libpthread.so', needed by 'Project'. Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/Project.dir/all' failed
make[1]: *** [CMakeFiles/Project.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
对我来说,还在学习 CMake 和 Make,这看起来像是在尝试编译已经编译的库 libpthread.so。当我从所需的 boost 组件中删除线程时,此错误消失。但是,当然程序不会编译,因为我确实使用了 boost::thread 库。
可能是什么问题?为什么 cmake 试图“制作”libpthread.so?链接时通常不会出现与共享库有关的任何错误吗?
我已经迷路了几天。任何帮助将不胜感激。
最好的问候 费利克斯
*我说几乎是因为 find_package(boost) 给出了以下警告:
CMake Warning at /usr/share/cmake-3.10/Modules/FindBoost.cmake:801 (message):
New Boost version may have incorrect or missing dependencies and imported
targets
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindBoost.cmake:907 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
CMakeLists.txt:99 (find_package)
但是,我不太彻底的 Google 搜索告诉我,这是由于 CMake 和 Boost 之间的某些版本差异造成的,可以忽略。
【问题讨论】:
-
欢迎来到 Stack Overflow。看起来 Boost::thread 使用 pthread,而
make正在寻找 pthread 库的arm-linux-gnueabihf版本。你有安装一个吗?如果是这样,make找不到它,因此您可能必须将 CMake 指向它存在的位置... -
非常感谢!我不知道为什么我没有早点研究这个。该库已安装,make 会找到指向该库的链接,但该链接因 rsync 根文件系统而中断。所以 `libpthread.so -> "Raspberrys absolute Path"/libpthread.so" 我将不得不修复那些。
标签: c++ boost cmake boost-thread