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