CMake обеспечивает ссылку тестов на встроенную, а не установленную библиотеку.C++

Программы на C++. Форум разработчиков
Anonymous
CMake обеспечивает ссылку тестов на встроенную, а не установленную библиотеку.

Сообщение Anonymous »

У меня проблема, очень похожая на вопрос: Как я могу указать тесты C++ на мою копию библиотеки в каталоге сборки, а не на установленную библиотеку, когда LD_LIBRARY_PATH указывает на установленную? но не связан с LD_LIBRARY_PATH.
В своем проекте я сначала создаю библиотеку, используя стандартные функции cmake. Вот упрощенная версия:

Код: Выделить всё

    # Installation directories
include(GNUInstallDirs)

# Build library
add_library(${PROJECT_NAME} SHARED
${SRC_FILES}
)

# Definitions
target_compile_definitions(${PROJECT_NAME} PUBLIC ${DEFINITIONS})

# Properties
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 20
)

# Compile options
target_compile_options(${PROJECT_NAME} PRIVATE
-Wall -Wextra -Wpedantic
)

# Include directories
target_include_directories(${PROJECT_NAME} PUBLIC
$
$
)

# System include directories
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC
${SYSTEM_INCLUDE_DIRS}
)

# Link libraries
target_link_libraries(${PROJECT_NAME} PUBLIC
${SYSTEM_LIBRARIES}
)
Затем я хочу создать несколько тестов, что я делаю с помощью аналогичной процедуры, и связать эти тесты с моей библиотекой (этот CMakeLists.txt находится в подпапке тестов):

Код: Выделить всё

    # Build tests
add_executable(${PROJECT_NAME}_tests
${TEST_SRC_FILES}
)

# Definitions
target_compile_definitions(${PROJECT_NAME}_tests PUBLIC ${TEST_DEFINITIONS})

# Properties
set_target_properties(${PROJECT_NAME}_tests PROPERTIES
CXX_STANDARD 20
)

# Compile Options
target_compile_options(${PROJECT_NAME}_tests PRIVATE
-Wall -Wextra -Wpedantic
)

# Include Directories
target_include_directories(${PROJECT_NAME}_tests PUBLIC
$
$
)

# System Include Directories
target_include_directories(${PROJECT_NAME}_tests SYSTEM PUBLIC
${TEST_SYSTEM_INCLUDE_DIRS}
)

# Link Libraries
target_link_libraries(${PROJECT_NAME}_tests PUBLIC
${PROJECT_NAME}
${TEST_SYSTEM_LIBRARIES}
)

# Enable ctest
enable_testing()
add_test(NAME ${PROJECT_NAME}_tests COMMAND ${PROJECT_NAME}_tests)
Когда я строю, все отлично. Тесты ссылаются на мою библиотеку, и жизнь хороша. Если я проверю исполняемый файл с помощью ldd, я увижу:

Код: Выделить всё

libmycoolproject.so => /home/username/src/mycoolproject/build/libmycoolproject.so (0x00007ffd2c8c3000)
И с readelf -d:

Код: Выделить всё

 0x0000000000000001 (NEEDED)             Shared library: [libconvert.so]
... (more libraries)
0x000000000000001d (RUNPATH)            Library runpath: [/home/username/src/mycoolproject/build:/usr/local/lib:/home/username/src/mycoolproject/build/gtest/lib]
Обратите внимание, что одна из системных библиотек, от которых я завишу, находится в /usr/local/lib.
Однако, как только я установите мою библиотеку с помощью sudo make install, ldd говорит мне:

Код: Выделить всё

libmycoolproject.so => /usr/local/lib/libmycoolproject.so (0x00007ffb480b3000)
Проблема в том, что если я делаю локальные изменения, собираю и запускаю тесты, тесты ссылаются на установленную библиотеку, а не на ту, что находится в моей папке сборки.Как я могу гарантировать, что мои тесты связаны с версией каталога сборки во время выполнения? Что здесь происходит с порядком ссылок/RUNPATH?
Что я пробовал, но безуспешно:
  • помещение BUILD_RPATH ${CMAKE_BINARY_DIR в set_target_properties
  • добавление к CMAKE_BUILD_RPATH
  • изменение порядок библиотек в target_link_libraries
  • связывание с ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.so вместо ${PROJECT_NAME


Подробнее здесь: https://stackoverflow.com/questions/787 ... ed-library

Вернуться в «C++»