У меня есть каскад библиотек A, B, C с B в зависимости от A и C в зависимости от A и B.
У меня есть финальная библиотека D и исполняемый файл, использующий ее. D зависит от A, B и C.
При сборке и экспорте каждой библиотеки за раз в локальный репозиторий все в порядке: D строит, ссылки и исполняемый файл работают отлично.
При ручном копировании репозитория, содержащего A, B, C, в другое место (и импорте в D из этого другого места), результаты будут переменными:
Проблема заключается в следующем:
D сборок и ссылок,
При запуске исполняемого файла он сразу падает,
При проверке D командой "ldd" он показывает странные вещи
??? => ??? (0x53a570000)
??? => ??? (0x180040000)
Я пытался сделать свои библиотеки перемещаемыми, но, похоже, я что-то упустил ...
В экспортированном целевом файле нет абсолютного пути.
Я видел кое-что о SO_NAME в Google, поэтому я попробовал это в D после импорта A, B и C:
set_property(TARGET A PROPERTY IMPORTED_NO_SONAME 1)
но это не решило проблему.
Я заблудился, может кто-нибудь помочь мне?
EDIT:
Код экспорта для A:
# Library
add_library(mylibA SHARED
${SOURCE_FILES}
${PUBLIC_HEADERS}
)
set_target_properties(mylibA PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
INTERFACE_LINK_LIBRARIES mylibA
)
target_include_directories(mylibA
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(mylibA)
# Packaging
if(ENABLE_MYLIBA_PACKAGING)
# Install target to export
install(TARGETS mylibA
EXPORT mylibA-export
LIBRARY DESTINATION "bin"
ARCHIVE DESTINATION "bin"
RUNTIME DESTINATION "bin"
PUBLIC_HEADER DESTINATION "include/mylibA"
)
# Install export
install(EXPORT mylibA-export
FILE mylibATargets.cmake
CONFIGURATIONS Debug|Release
DESTINATION "cmake"
)
# Install config file
install(FILES mylibAConfig.cmake
CONFIGURATIONS Debug|Release
DESTINATION "cmake"
)
export(PACKAGE mylibA)
endif()
Код импорта в D's Cmake:
# Import
find_package(mylibA PATHS ${REPO_PATH})
find_package(mylibB PATHS ${REPO_PATH})
find_package(mylibC PATHS ${REPO_PATH})
# Library
add_library(mylibD SHARED
${SOURCE_FILES}
${CONFIG_HEADERS}
${PUBLIC_HEADERS}
)
set_target_properties(mylibD PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
target_include_directories(mylibD
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../inc>
$<BUILD_INTERFACE:${mylibA_INCLUDE_DIR}>
)
target_link_libraries(mylibD
PUBLIC mylibA
PUBLIC mylibB
PUBLIC mylibC
)