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

У меня есть каскад библиотек A, B, C с B в зависимости от A и C в зависимости от A и B.

У меня есть финальная библиотека D и исполняемый файл, использующий ее. D зависит от A, B и C.

При сборке и экспорте каждой библиотеки за раз в локальный репозиторий все в порядке: D строит, ссылки и исполняемый файл работают отлично. При ручном копировании репозитория, содержащего A, B, C, в другое место (и импорте в D из этого другого места), результаты будут переменными:

  • Все отлично работает в Windows (Visual Studio),

  • В Cygwin существует проблема времени выполнения.

Проблема заключается в следующем:

  • 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
)

1 Ответ

0 голосов
/ 04 апреля 2019

Проблема Cygwin возникла из-за прав доступа: при копировании файлов в Windows были установлены очень ограниченные права доступа по умолчанию в cygwin, что вызвало описанную проблему времени выполнения.

Я использовал chmod в cygwin после копирования/ перед сборкой и ссылкой, и это решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...