Bezdepbonusu7Программирование: статьи и ответы

Вопрос

CMake GET_RUNTIME_DEPENDENCIES не может найти библиотеку dll, когда она связана через lib (библиотека импорта)?

Автор вопроса: ephemerrОтветов: 1

Сборка ОС: Windows 10, Cmake 3.16.3.

Я использую target_link_libraries, чтобы связать сторонний .lib файл с моей .dll библиотекой.

Но когда я использую GET_RUNTIME_DEPENDENCIES для установки dll, зависимости не обнаружено.

Это происходит только в Windows, установка в Linux в порядке.

Есть ли какие-нибудь подсказки, как решить эту проблему или хотя бы как ее отладить?

Какая именно команда использует CMake в Windows для определения зависимостей?

Я вызываю GET_RUNTIME_DEPENDENCIES так:

file(GET_RUNTIME_DEPENDENCIES
    RESOLVED_DEPENDENCIES_VAR RES
    UNRESOLVED_DEPENDENCIES_VAR UNRES
    CONFLICTING_DEPENDENCIES_PREFIX CONFLICTING_DEPENDENCIES
    EXECUTABLES ${EXECS}
    LIBRARIES ${LIBS} ${MODULES} ${QTPLUGINS_LIBS}
    DIRECTORIES ${RUNTIME_DEPENDENCIES_DIRECTORIES}
    POST_EXCLUDE_REGEXES ${PLATFORM_POST_EXCLUDE_REGEXES}
)

Где LIBS содержит мой dll, но нет RES нет UNRES содержит путь к 3-му патчу dll.

  • Пожалуйста, предоставьте некоторый код (желательно, минимально воспроизводимый пример). При наличии текущей информации решение проблемы представляет собой сложную игру в догадки. Tsyvarev 03.02.2020

cmakedlldllimport

Ответы

Ответ 1 · рейтинг 1 · scx

GET_RUNTIME_DEPENDENCIES не знает о ваших переменных времени настройки, поэтому вам нужно указать их вручную. В этом ответе говорится, что вы могу передать переменные на шаг установки, но я пока не смог заставить это работать. К счастью, он поддерживает выражения генератора.

Другая проблема в вашем фрагменте кода заключается в том, что он должен вызываться во время установки. Например, в блоке install(CODE ...).

Итак, имея все это в виду, это должно помочь вам начать.

install(CODE [[
    file(GET_RUNTIME_DEPENDENCIES
        RESOLVED_DEPENDENCIES_VAR RES
        UNRESOLVED_DEPENDENCIES_VAR UNRES
        CONFLICTING_DEPENDENCIES_PREFIX CONFLICTING_DEPENDENCIES
        EXECUTABLES $<TARGET_FILE:your_executable_target_name>
        LIBRARIES $<TARGET_FILE:a_lib_target_name>
    )

    message("\n\nFound dependencies :")
    foreach(DEP ${RES})
        message("${DEP}")
    endforeach()
    message("\n\nNot found dependencies :")
    foreach(DEP ${UNRES})
        message("${DEP}")
    endforeach()
]])

Создайте цель установки, чтобы увидеть результаты.

cmake ..
cmake --build . --target install

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы