Связывание потока повышения: нет правила для создания цели «…/libpthread.so «

#c #boost #cmake #boost-thread

#c #повышение #cmake #поток повышения

Вопрос:

Я пытаюсь выполнить кросс-компиляцию проекта на моем 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 это местоположение моей корневой файловой системы RaspberryPi, которую я скопировал из pi в свой WSL.

The 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 и может быть проигнорировано.

Комментарии:

1. Добро пожаловать в Stack Overflow. Похоже, что Boost::thread использует pthread и make ищет arm-linux-gnueabihf версию библиотеки pthread. У вас он уже установлен? Если это так, make не удается найти его, поэтому вам, возможно, придется указать CMake, где он существует…

2. Большое вам спасибо! Я не знаю, почему я не изучил это раньше. Библиотека установлена, и make находит ссылку на библиотеку, но эта ссылка была разорвана при повторной синхронизации корневой файловой системы. Итак `libpthread.so -> «Абсолютный путь Raspberrys»/libpthread.so » Мне придется их исправить.

Ответ №1:

Хорошо, я нашел свою ошибку, благодаря @squareskittles. Когда я использовал rsync для копирования корневой файловой системы моего Raspberry Pi в мой WSL, он «сломал» все ссылки. Таким образом, в этом случае /usr/lib/arm-linux-gnueabihf/libpthread.so указывается абсолютный путь к библиотеке, а именно /lib/arm-linux-gnueabihf/libpthread.so.0 . Однако на моем компьютере этот путь был другим, поскольку он находился в моей папке raspi_root.

Я восстановил ссылку с помощью варианта этой удобной команды (заслуги Марка Вагнера)

 
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 результата поиска) с ‘/’, что означает, что ссылка ссылается на абсолютный путь. Затем он заменяет первое появление ‘/’ моим новым путем к корневой файловой системе.

Я думаю, это означает, что я не должен перемещать или переименовывать корневую папку, иначе мои ссылки снова будут разорваны.