链接Boost Thread:没有规则可将目标设置为“ ... / libpthread.so”

问题描述

我正在尝试在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)是否以“ /”开头,这意味着该链接引用的是绝对路径。然后,它用我到根文件系统的新路径替换了第一次出现的'/'。

我认为这意味着我不能移动或重命名根文件夹,否则我的链接将再次断开。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...