Импортировать внешнюю библиотеку в узел ROS

Я впервые использую переполнение стека, поэтому я немного новичок в этом. Я работал над личным проектом робототехники и скачал каталог GitHub. Я уже скомпилировал его, протестировал (работает) и создал файл library.a (потому что я работаю с Ubuntu 16.04 и ROS Kinetic). Я не знаю, что мне нужно добавить в свой CMakeLists.txt файл, чтобы загрузить функции связи в файл cpp узла ROS.

Мое фактическое описание компиляции файла CMakeLists.txt следующее:

...
add_executable(test_node src/test_node.cpp)
add_dependencies(test_node ${catkin_EXPORTED_TARGETS})
target_link_libraries(test_node ${catkin_LIBRARIES})
...

Я знаю, что мне нужно добавить библиотеку в target_link_libraries, если библиотека была *.sofile, но это не так. Что мне нужно добавить в мой CMakeLists.txt файл, чтобы загрузить свои библиотечные функции в мой узел ROS?


person Drodgu    schedule 24.09.2019    source источник


Ответы (1)


Ваш ответ основан на свойстве функции add_library ()

См. Этот пример блока:

add_library(library_name STATIC IMPORTED)
set_target_properties(library_name PROPERTIES IMPORTED_LOCATION path/to/your/lib.a)

После этого вы можете продолжить добавление этой библиотеки с помощью:

target_link_libraries(your_target library_name)

Но не забудьте добавить файлы статической библиотеки в вашу цель.


Проблема решается с помощью следующего кода:

...
find_package(Threads)
add_library(github_library STATIC IMPORTED GLOBAL)
set_target_properties(my_library PROPERTIES IMPORTED_LOCATION 
my_library_directory/my_library.a)
...
target_link_libraries(my_cpp_ros_node ${catkin_LIBRARIES} my_library ${CMAKE_THREAD_LIBS_INIT})
...
person Vinicius Botelho Souza    schedule 24.09.2019
comment
но если ваша статическая библиотека может быть скомпилирована извне, я рекомендую проверить использование этой ExternalProject_Add(), это может быть более полезным и удобным. - person Vinicius Botelho Souza; 24.09.2019
comment
Он начинает компилироваться, но есть некоторые ошибки компиляции из-за того, как создается библиотека. Может быть проблема совместимости, потому что моя библиотека скомпилирована с использованием Makefile, а мой проект ROS использует CMakeLists.txt? Не думаю, но ошибка компиляции следующая: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5 - person Drodgu; 25.09.2019
comment
Не могли бы вы предложить мне простой пример использования ExternalProject_Add ()? Я немного новичок в программировании с помощью CMake, и документация может немного сбивать с толку. - person Drodgu; 25.09.2019
comment
(1) если вы скомпилировали свой проект ROS с другой системой сборки, он сломается. Но я думаю, что вы забыли указать ссылку на поток p: target_link_libraries(your_target library_name p_thread) (2), если у вас есть репозиторий git для этого проекта, я могу написать вам пример использования. - person Vinicius Botelho Souza; 25.09.2019
comment
Оно работает! Большое спасибо, я отредактирую ваш ответ, если вы не против обновить решение. - person Drodgu; 26.09.2019