CMake связывает общую библиотеку с версией системы вместо собственной - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть собственная версия 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?

...