【问题标题】:What does this strange "/usr/bin/ld: cannot find -lXAW_LIBRARY-NOTFOUND" error mean?这个奇怪的“/usr/bin/ld: 找不到 -lXAW_LIBRARY-NOTFOUND”错误是什么意思?
【发布时间】:2019-06-29 03:07:54
【问题描述】:

我在 C++ 中创建了一个 ROS2 rviz 插件,我需要使用 cmake 将其编译成 shared 库 (.so)。我已经有一个工作的 CMakeLists.txt(见下文),它创建了一个 static 库(.a);不过,我需要共享它。

但是,当我将 SHARED 关键字添加到 add_library 宏(在下面的代码中注释掉)时,它会抛出这个奇怪的错误:

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

现在,我在 SO(如 this)上查看了许多“/usr/bin/ld: 找不到 [some library]”问题,但我的错误似乎是更奇怪的是,它似乎在错误(/usr/bin/ld:找不到...)中包含错误(“-lXAW_LIBRARY-NOTFOUND”)。我的意思是,他为什么还要寻找一个名为 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 上问过 a more broad version of this question,但它似乎太特定于 cmake 之类的。无论如何,我在那里没有得到答案。 (上面的代码不是 MWE,抱歉;如果需要我可以创建一个,但它需要 ROS2 编译...)

【问题讨论】:

  • 表示没有找到库xaw。见find_libraryIf nothing is found, the result will be &lt;VAR&gt;-NOTFOUND
  • 啊!但是在我的 target_link_libraries 中没有像 XAW 这样的东西......它可能是一些依赖还是什么?
  • 这就是为什么所有 find 包都应该调用find_package_handle_standard_args 以在缺少强制库时使配置失败!
  • 成功了!!非常感谢你们!真的很简单。 sudo apt-get install libxaw7-dev 做到了。现在我觉得有点愚蠢......这花了我好几天......
  • @JoeyMallone,想让它成为答案,以便我接受/投票吗?

标签: c++ cmake shared-libraries ld


【解决方案1】:

如果您将一些库名称作为参数提供给target_link_libraries 函数,通常会弹出该错误。

要么,

  1. 名称不正确或,
  2. 路径不是或,
  3. 未安装库。

我会将target_link_libraries(delegator_lib rviz_common::rviz_common)link_directories(${ament_cmake_LIBRARY_DIRS}) 视为嫌疑人。

CMake 中,您可以使用MESSAGE 命令进行各种调试,您可以在其中显示 CMake 变量的值,以检查它们是否与系统上的内容有关。

您也可以尝试像sudo apt-get install libxaw7-dev 那样安装 XAW 库。可能是您链接到的库之一依赖于 XAW 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多