У меня есть собственная версия libusb внутри директории с исходным кодом проекта, которую я нахожу с:
find_path(LibUsb_INCLUDE_DIR NAMES libusb.h PATHS ${CMAKE_CURRENT_SOURCE_DIR}/LibUsb/Include)
if(NOT LibUsb_INCLUDE_DIR)
message(FATAL_ERROR "LibUsb: include directory not found")
endif()
find_library(LibUsb_LIBRARY NAMES usb-1.0 libusb-1.0 PATHS ${OUTPUT_BIN_DIR})
if(NOT LibUsb_LIBRARY)
message(FATAL_ERROR "LibUsb: library not found")
endif()
add_library(LibUsb SHARED IMPORTED GLOBAL)
set_target_properties(LibUsb PROPERTIES IMPORTED_LOCATION ${LibUsb_LIBRARY})
set_target_properties(LibUsb PROPERTIES IMPORTED_IMPLIB ${LibUsb_LIBRARY})
set_target_properties(LibUsb PROPERTIES IMPORTED_NO_SONAME ON)
set_target_properties(LibUsb PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${LibUsb_INCLUDE_DIR})
message(STATUS "LibUsb: found at ${LibUsb_LIBRARY}")
Этот запуск успешно, где я получаю
-- LibUsb: found at /mnt/c/x/Build/Linux-Debug/Output/Bin/libusb-1.0.so
Тогда я связываю это с
target_link_libraries(${TARGET_NAME} ... LibUsb)
Где я проверял link.txt
, что CMake производит для этой цели:
/usr/bin/g++-4.8 -Wall -Werror -Wextra -Wno-missing-field-initializers -g ... -lusb-1.0
Но при проверке моего двоичного файла я получаю
gal@GalA-T480:/mnt/c/x$ readelf -d Build/Linux-Debug/Output/Bin/myexe | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libusb-1.0.so.0]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
gal@GalA-T480:/mnt/c/x$ ldd Build/Linux-Debug/Output/Bin/myexe
linux-vdso.so.1 (0x00007fffcd197000)
libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007f1a49930000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1a495a0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1a49380000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1a49160000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a48d60000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f1a48b40000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1a48790000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1a49c00000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1a48580000)
gal@GalA-T480:/mnt/c/x$
Я не понимаю, почему исполняемый файл ищет libusb-1.0.so.0
, а не libusb-1.0.so
. Я также не понимаю, почему он находит это в системных каталогах, а не в моих.
Можно ли как-нибудь использовать RPATH
, чтобы решить это? Предпочтительно использовать CMake?