【问题标题】:How to solve the 'undefined reference to libusb' error in ros?如何解决 ros 中的“未定义对 libusb 的引用”错误?
【发布时间】:2014-11-25 19:20:00
【问题描述】:

我正在尝试将相机(非uvc)流程序传输到ros平台。

我已经运行了相机驱动程序

而Makefile是这样的:


g++ main.cpp -o test_gui -g -I /usr/local/include -L /usr/local/lib -D_LIN -D_DEBUG -L../lib/x64 -I../include -lASICamera -lpthread -lusb - DGLIBC_20 -m64 -lrt -I/opt

现在我想在一个 ros 节点中做这件事,所以我写了一个节点,其中的 CMakelists 是这样的:


include_directories(
  ${catkin_INCLUDE_DIRS}
)
include_directories(/usr/local/include)
include_directories(/root/catkin_ws/src/asi_converter_real/include/asi_converter_real)
link_directories(/usr/local/lib)
link_libraries(pthread)
link_libraries(usb)
link_libraries(libASICamera.a)
link_libraries(libASICamera.so)
add_executable(asi_converter_real src/asi_converter_real.cpp)
target_link_libraries(asi_converter_real ${catkin_LIBRARIES})

而生成到/catkin_ws/build/***/中的Makefile行是这样的:


/usr/bin/c++ CMakeFiles/asi_converter_real.dir/src/asi_converter_real.cpp.o -o /root/catkin_ws/devel/lib/asi_converter_real/asi_converter_real -rdynamic -L/usr/local/lib -lpthread -lusb -Wl, -Bstatic -lASICamera -Wl,-Bdynamic -lASICamera

但是系统好像找不到libusb的动态库,因为它报告了


undefined reference to `libusb_set_configuration'
undefined reference to `libusb_claim_interface'
/usr/local/lib/libASICamera.a(ASI174MM.o): In function `WorkingFunc(void*)':
undefined reference to `libusb_bulk_transfer'
undefined reference to `libusb_bulk_transfer'

[1]有人知道如何解决这个问题吗?

[2]如何在我的电脑中找到libusb的.a和.so? (我确定我有它们,因为我可以 pkg-config --cflags/--libs 它们)

[3]如何在 ros CMakelists 中显式链接动态库?或者只是 link_libraries(usb) 对于静态和动态库都足够了?

【问题讨论】:

    标签: c++ linux makefile cmake ros


    【解决方案1】:

    find_package 要求 CMake 有对应的Find<package>.cmake

    Cmake 有一个pkg-config module

    您可以使用它来编写自己的 FindLibUSB,as explained on the CMake wiki

    或者你可以直接在你的 CMakeLists.txt 中使用它:

    find_package(PkgConfig REQUIRED)
    pkg_search_module(LIBUSB1 REQUIRED libusb-1.0)
    include_directories(SYSTEM ${LIBUSB1_INCLUDE_DIRS})
    

    您可以在the module documentation 中看到所有设置的变量:LIBUSB1_LIBRARIES 用于库等...

    【讨论】:

      【解决方案2】:

      在 cmake 中查找库通常使用 find_package 完成。

      在您的情况下,它可能看起来像这样(取自this question):

      find_package(libusb-1.0 REQUIRED)
      include_directories (${LIBUSB_1_INCLUDE_DIRS})
      ...
      target_link_libraries(asi_converter_real ${catkin_LIBRARIES} ${LIBUSB_1_LIBRARIES})
      

      当然你可能需要调整版本号(也许可以简单地去掉)。

      【讨论】:

      • 嗨 luator,你还在吗?我认为我的系统找不到这个包,它报告 :(find_package): 找不到包 libusb-1.0 的配置文件。将 libusb-1.0_DIR 设置为包含 libusb-1.0 的 CMake 配置文件的目录。该文件将具有以下名称之一: libusb-1.0Config.cmake libusb-1.0-config.cmake
      • 我不认为我的系统有这两个变量 ${LIBUSB_1_INCLUDE_DIRS} 和 ${LIBUSB_1_LIBRARIES},我输入 apt-get install libusb-1.0 它只是说我已经安装了这个。然而,我不知道 libusb 在哪里。它不在 /usr/lib /usb/bin 或 /usr/local/lib 中。我可以准确定位这个包并使用绝对路线吗?
      • @ThuVlion 如果 find_package 成功,则自动设置变量。错误消息表明您需要Find<package>.cmake,如另一个答案中所述。如果您将来在其他库中遇到此问题:在大多数情况下,您只需向 google 询问“Find.cmake” 即可找到合适的查找文件
      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 2013-02-14
      • 2014-10-07
      • 1970-01-01
      • 2011-10-26
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多