Что означает эта странная ошибка "/ usr / bin / ld: not find -lXAW_LIBRARY-NOTFOUND"? - PullRequest
0 голосов
/ 05 февраля 2019

Я создал плагин ROS2 rviz в C ++, который мне нужно скомпилировать в разделяемую библиотеку (.so) с помощью cmake.У меня уже есть работающий CMakeLists.txt (см. Ниже), который создает библиотеку static (.a);Мне нужно, чтобы он был предоставлен для общего доступа.

Однако, когда я добавляю ключевое слово SHARED в макрос add_library (закомментированный в приведенном ниже коде), выдается странная ошибка:

/usr/bin/ld: cannot find -lXAW_LIBRARY-NOTFOUND

Теперь я рассмотрел множество вопросов "/ usr / bin / ld: not find [некоторая библиотека] " здесь на SO (например, this ), номоя ошибка кажется более странной, так как она содержит ошибку ("-lXAW_LIBRARY-NOTFOUND") В ошибке (/ usr / bin / ld: не удается найти ...).Я имею в виду, почему он даже ищет библиотеку под названием LIBRARY_NOTFOUND ??

Я нахожусь на Ubuntu xenial 16.04 с использованием cmake 3.10.

CMakeLists.txt:

project(traffic_sign_delegation_manager)

set(CMAKE_CXX_STANDARD 17)

if(NOT WIN32)
  add_definitions(-fPIC)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic -Wno-deprecated-declarations)
endif()

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rviz_common REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(rosidl_generator_cpp)
find_package(pluginlib REQUIRED)

find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets)

set(msg_files
  "msg/TrafficSignList.msg"
  "msg/TrafficSign.msg"
  "msg/TrafficSignSetList.msg"
  "msg/TrafficSignSet.msg"
  "msg/TrafficSignSetStatus.msg"
  "msg/TrafficSignsManaged.msg"
  "msg/AccLever2.msg"
  "msg/VehicleOdometry.msg"
)

rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  DEPENDENCIES std_msgs
)

link_directories(${ament_cmake_LIBRARY_DIRS})

add_definitions(-DQT_NO_KEYWORDS)

qt5_wrap_ui(QT_UI_FILES ui/traffic_sign_delegation_manager_panel.ui)
qt5_wrap_ui(QT_UI_FILES ui/traffic_sign_list_item.ui)

qt5_add_resources(QT_QRC_FILES ui/traffic_sign_delegation_manager.qrc)

set_property(SOURCE traffic_sign_delegation_manager_panel.h PROPERTY SKIP_AUTOMOC ON)
set_property(SOURCE draw_area.h PROPERTY SKIP_AUTOMOC ON)
set_property(SOURCE adv_interaction_groupbox.h PROPERTY SKIP_AUTOMOC ON)
set_property(SOURCE traffic_sign_delegation_manager_display.h PROPERTY SKIP_AUTOMOC ON)

add_library(delegator_lib   # SHARED # <=== WHY IS THIS NOT WORKING?
  vec2d.cpp
  vec2d.h
  traffic_sign_delegation_manager_panel.cpp
  traffic_sign_delegation_manager_panel.h
  draw_area.cpp
  draw_area.h
  traffic_sign_delegation_manager_display.cpp
  traffic_sign_delegation_manager_display.h
  adv_interaction_groupbox.cpp
  adv_interaction_groupbox.h
  ui/traffic_sign_list_item.ui
  ui/traffic_sign_delegation_manager_panel.ui
  ${QT_UI_FILES}
  ${MOC_FILES}
)

rosidl_target_interfaces(delegator_lib ${PROJECT_NAME} "rosidl_typesupport_cpp")

target_include_directories(delegator_lib PUBLIC
  ${rvizCommon_DIR}
  ${rosidl_generator_cpp_INCLUDE_DIRS}
  ${ament_cmake_INCLUDE_DIRS}
  ${rviz2_INCLUDE_DIRS}
  ${rviz_common_INCLUDE_DIRS}
  ${FREETYPE_INCLUDE_DIRS}
  ${Qt5_INCLUDE_DIRS}
)

target_link_libraries(delegator_lib
  rviz_common::rviz_common
)

target_compile_definitions(delegator_lib PRIVATE "RVIZ_DEFAULT_PLUGINS_BUILDING_LIBRARY")
target_compile_definitions(delegator_lib PUBLIC "PLUGINLIB__DISABLE_BOOST_FUNCTIONS")

pluginlib_export_plugin_description_file(rviz_common plugin_description.xml)

ament_target_dependencies(delegator_lib
  geometry_msgs
  laser_geometry
  nav_msgs
  map_msgs
  rclcpp
  resource_retriever
  urdf
  visualization_msgs
)

ament_export_include_directories(${INCLUDE_DIRS} ${ament_cmake_INCLUDE_DIRS} include)
ament_export_interfaces(delegator_lib HAS_LIBRARY_TARGET)

ament_export_dependencies(
  Qt5
  rviz_common
  geometry_msgs
  laser_geometry
  map_msgs
  nav_msgs
  rclcpp
  urdf
  visualization_msgs
  rosidl_generator_cpp
)

install(FILES plugin_description.xml
  DESTINATION share/${PROJECT_NAME})
install(DIRECTORY images
  DESTINATION share/${PROJECT_NAME})
install(DIRECTORY ui
  DESTINATION share/${PROJECT_NAME}
  PATTERN "*.ui"
  EXCLUDE)

install(
  TARGETS delegator_lib
  EXPORT delegator_lib
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)

install(
  DIRECTORY "${CMAKE_SOURCE_DIR}/icons"
  DESTINATION "share/${PROJECT_NAME}"
)

ament_package()

Обратите внимание: этот вопрос не о ROS;Я не мастер cmake, так что, вероятно, я просто делаю что-то ужасно неправильно в cmake ... Я уже задавал более широкую версию этого вопроса на answers.ros, но, похоже, он слишком cmake-конкретный или что-то.Во всяком случае, я не получил ответа там.(Приведенный выше код не является MWE, извините; я мог бы создать его в случае необходимости, но для компиляции потребуется ROS2 ...)

1 Ответ

0 голосов
/ 05 февраля 2019

Обычно эта ошибка появляется, если вы даете имена библиотек в качестве аргументов функции target_link_libraries.

Либо

  1. Имена неверны, либо,
  2. Путь не является или
  3. Библиотеки не установлены.

Я бы посмотрел на target_link_libraries(delegator_lib rviz_common::rviz_common) и link_directories(${ament_cmake_LIBRARY_DIRS}) как на подозреваемых.

В CMake вы можете использовать команду MESSAGE для выполнения отладки, где вы можете отобразить значения переменных CMake, чтобы проверить, имеют ли они смысл с тем, что находится в системе.

Также вы можете попробовать установить библиотеку XAW , например, sudo apt-get install libxaw7-dev.Возможно, одна из библиотек, на которую вы ссылаетесь, зависит от библиотеки XAW.

...