问题描述
我正在尝试在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之间存在某些版本差异,因此可以忽略。
解决方法
好的,由于@squareskittles,我发现了自己的错误。
当我使用rsync将Raspberry Pi的根文件系统复制到WSL时,它“破坏”了所有链接。因此,在这种情况下,/usr/lib/arm-linux-gnueabihf/libpthread.so
指向库的绝对路径,即/lib/arm-linux-gnueabihf/libpthread.so.0
。
但是,在我的机器上,此路径不同,因为它位于我的raspi_root文件夹中。
我使用此方便命令的变体(向Mark Wagner致谢)修复了链接
find ../raspi_root -type l -ls |
awk '$13 ~ /^\// { sub("/","/<MYPATH-TO-RASPI_ROOT/",$13); print $11,$13 }' |
while read A B; do rm $A; ln -s $B $A; done
如果我正确理解,它将检索所有链接,并检查目标位置(查找结果的参数$ 13)是否以“ /”开头,这意味着该链接引用的是绝对路径。然后,它用我到根文件系统的新路径替换了第一次出现的'/'。
我认为这意味着我不能移动或重命名根文件夹,否则我的链接将再次断开。