C++ 链接Boost线程:没有规则使target“/libpthread.so“;

C++ 链接Boost线程:没有规则使target“/libpthread.so“;,c++,boost,cmake,boost-thread,C++,Boost,Cmake,Boost Thread,我正试图在我的Linux Ubuntu 18.04 WSL上为Raspberry Pi交叉编译一个项目。我已经通过sudo-apt-install gcc-arm-linux-gnueabihf安装了工具链,因此它位于unter/usr/bin/上 现在,在我的CMake文件中,我设置了以下内容: set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(SYSROOT "${CMAKE_

我正试图在我的Linux Ubuntu 18.04 WSL上为Raspberry Pi交叉编译一个项目。我已经通过
sudo-apt-install gcc-arm-linux-gnueabihf
安装了工具链,因此它位于unter
/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和Make的我来说,这看起来像是在编译已经编译好的库
libpthread.so
。当我从所需的boost组件中删除线程时,此错误消失。但是,程序当然不会编译,因为我确实使用boost::thread库

可能是什么问题?为什么cmake试图“生成”libpthread.so?链接时不会经常出现任何关于共享库的错误吗

我已经迷路好几天了。任何帮助都将不胜感激

致意 费利克斯

*我这么说几乎是因为find_包(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)

然而,我不太彻底的谷歌搜索告诉我,这是由于CMake和Boost之间的版本差异造成的,可以忽略。

好的,多亏了@squareskittles,我发现了我的错误。 当我使用rsync将Raspberry Pi的根文件系统复制到WSL时,它“中断”了所有链接。因此在本例中,
/usr/lib/arm-linux-gnueabihf/libpthread.So
指向库的绝对路径,即
/lib/arm-linux-gnueabihf/libpthread.So.0
。 但是在我的机器上,这个路径是不同的,因为它位于我的raspi_根文件夹中

我用这个方便命令的一个变体修复了链接(归功于)


查找../raspi_根类型l-ls|

awk'$13~/^\/{sub(“/”,"/欢迎使用堆栈溢出。看起来Boost::thread使用pthread,
make
正在寻找pthread库的
arm linux gnueabihf
版本。您是否安装了pthread库?如果安装了,
make
无法找到它,因此您可能必须将CMake指向它存在的位置……非常感谢!我不知道为什么我没有查看它已安装库并使make找到指向库的链接,但该链接已被根文件系统同步破坏。因此`libpthread.So->“Raspberrys absolute Path”/libpthread.So”我必须修复这些链接。
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)

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