CMake - определить каталог или файлы dll для сгенерированного проекта - PullRequest
0 голосов
/ 04 января 2019

У меня есть проект, который я строю, используя CMake для Visual Studio.
Для файла .exe требуется 2 dll-файла (которые я сейчас копирую в отладчик).

Есть ли способ добавить каталог dlls / dll через CMakeLists.txt / FindLibrary.cmake
(так же, как это делается с помощью find_library для поиска *.lib или каким-либо другим способом, который я игнорирую), чтобы я не копировал их ВРУЧНУЮ внутри папка Debug каждый раз, когда я генерирую проект в другой папке / pc (поскольку папка dll известна)?

ОБНОВЛЕНИЕ:

CMakeLists.txt

..
..
set (ENVLIB $ENV{MYLIB})
FUNCTION (CONFIGURE_DEBUGGER TARGET_NAME)
  CONFIGURE_FILE(common/build/template/Main.vcxproj.user
    ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user
    @ONLY
    )
ENDFUNCTION (CONFIGURE_DEBUGGER)
..
..
ADD_EXECUTABLE(Main Main.cxx)
CONFIGURE_DEBUGGER(Main)

Main.vcxproj.user

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerCommandArguments>-D20</LocalDebuggerCommandArguments>
    <LocalDebuggerEnvironment>PATH=@ENVLIB@bin;$(Path)
$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>

  <!-- Additional PropertyGroups for the rest of Configuration/Platform combos -->

</Project>

Вывод vcxproj.user после генерации
<LocalDebuggerEnvironment>PATH=C:\Program Files\MyLib\bin;$(Path)

Переменная ENVLIB была изменена на правильный путь, когда файл был скопирован, но
Visual Studio все еще запрашивает эти библиотеки DLL. Это как игнорирование файла .vcxproj.user

решено:

Решено изменено свойство: <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> на
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

1 Ответ

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

Первый вариант - создать пользовательскую цель, которая будет запускать сценарий CMake для копирования файлов.

Второй вариант (который я предпочитаю) заключается в использовании CONFIGURE_FILE для создания файла .vcxproj.user, который устанавливает LocalDebuggerEnvironment так, чтобы каталог с DLL добавлялся в PATH.

Например, моя система сборки определяет функцию CONFIGURE_DEBUGGER:

FUNCTION(CONFIGURE_DEBUGGER TARGET_NAME)
  CONFIGURE_FILE(${ROOT}/common/build/template/executable_vs14.vcxproj.user
    ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user
    @ONLY
    )
ENDFUNCTION(CONFIGURE_DEBUGGER)

Я вызываю эту функцию сразу после определения исполняемой цели, например,

ADD_EXECUTABLE(example
  ${EXAMPLE__SRC}
  ${EXAMPLE__HDR}
)
CONFIGURE_DEBUGGER(example)

Шаблон executable_vs14.vcxproj.user выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerCommandArguments>-D20</LocalDebuggerCommandArguments>
    <LocalDebuggerWorkingDirectory>$(TargetDir)\..\..\common\</LocalDebuggerWorkingDirectory>
    <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\deps\bin;$(Path)
$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>

  <!-- Additional PropertyGroups for the rest of Configuration/Platform combos -->

</Project>

Примечание. В приведенном выше примере я также установил некоторые аргументы команды по умолчанию, с которыми приложение запускается при отладке, а также рабочий каталог, в котором оно запускается.

Примечание 2: Теперь, когда я смотрю на это, возможно, мы можем изменить Condition на PropertyGroup, чтобы он применялся к каждой конфигурации / платформе. Надо разобраться в этом.

...