链接 Boost 线程:没有制定目标“.../libpthread.so”的规则

Linking Boost Thread: No rule to make target ".../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::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 时,它“破坏”了所有 link。所以本例中/usr/lib/arm-linux-gnueabihf/libpthread.so指向的是库的绝对路径,即/lib/arm-linux-gnueabihf/libpthread.so.0。 但是在我的机器上这个路径是不同的,因为它位于我的 raspi_root 文件夹中。

我用这个方便的命令的变体修复了 link(致谢 Mark Wagner


find ../raspi_root -type l -ls |
awk ' ~ /^\// { sub("/","/<MYPATH-TO-RASPI_ROOT/", ); print ,  }' |
while read A B; do rm $A; ln -s $B $A; done

如果我理解正确,这会检索所有 link 并检查目标(查找结果的参数 $13)是否以“/”开头,这意味着 link 指的是绝对路径。然后,它将第一次出现的“/”替换为我的根文件系统的新路径。

我认为这意味着我不能移动或重命名根文件夹,否则我的 link 将再次损坏。