如何解决对libusb'的未定义引用? ros的错误?

时间:2014-11-25 08:42:27

标签: c++ linux makefile cmake ros

我正在尝试将相机(非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)对静态和动态libriries都足够了吗?

2 个答案:

答案 0 :(得分:1)

通常使用find_package来查找cmake中的库。

在您的情况下,它可能看起来像这样(取自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})

您可能需要调整课程的版本号(可能只是删除它)。

答案 1 :(得分: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用于库等等。