Вторник, 23.09.2025 19:00

Собираем программу C++ написанную под GCC c помощью MSVC и CMake

Собираем программу C++ написанную под GCC c помощью MSVC и CMake

В предыдущей статье мы рассмотрели сборку библиотеки С++ написанной для GCC с помощью MSVC и CMake. Для сборки программы colortable, создание которой мы рассматривали в предыдущих статьях, нам тоже понадобится внести некоторые изменения в проект CMake.

Сегодня мы рассмотрим сборку программы написанной для GCC с помощью MSVC и CMake.

Настройка проекта

Мы будем работать в среде, рассмотренной в предыдущей статье – в системе установлен только компилятор MSVC.

Начнем мы с проекта, размещенного в git-репозитории. Мы продолжим настройку проекта из прошлой статьи.

Если папка:

c:\project\colortable_msvc

уже существует, переместите или удалите её:

cd c:\projects
rmdir /q/s colortable_msvc

Мы будем использовать проект из git-репозитория:

cd c:\projects
rmdir /q/s articles_blog_altuninvv_ru
git clone https://gitflic.ru/project/vasiliyaltunin/articles_blog_altuninvv_ru.git --depth 1

Скопируем папку с проектом:

xcopy /y/e .\articles_blog_altuninvv_ru\qt6\colortable_msi_custom\ .\colortable_msvc\

Попробуем сконфигурировать:

cd c:\projects\colortable_msvc
cmake -S . -B build

Запустим сборку:

cmake --build build
Версия MSBuild 17.14.23+b0019275e для .NET Framework

  1>Checking Build System
  Building Custom Rule C:/projects/colortable_msvc/build/_deps/colorconsole-src/CMakeLists.txt
  colorconsole.cpp
  Auto build dll exports
     Создается библиотека C:/projects/colortable_msvc/build/_deps/colorconsole-build/colorconsole.lib и объект C:/proje
  cts/colortable_msvc/build/_deps/colorconsole-build/colorconsole.exp
  colorconsole.vcxproj -> C:\projects\colortable_msvc\build\_deps\colorconsole-build\colorconsole.dll
  Building Custom Rule C:/projects/colortable_msvc/CMakeLists.txt
  main.cpp
  colorconsoleapp.vcxproj -> C:\projects\colortable_msvc\build\Debug\colorconsoleapp.exe
  Building Custom Rule C:/projects/colortable_msvc/CMakeLists.txt

Запустим сборку и копирование .dll файлов:

cmake --build build --target=package
Версия MSBuild 17.14.23+b0019275e для .NET Framework

  Auto build dll exports
  colorconsole.vcxproj -> C:\projects\colortable_msvc\build\_deps\colorconsole-build\colorconsole.dll
  colorconsoleapp.vcxproj -> C:\projects\colortable_msvc\build\Debug\colorconsoleapp.exe
  1>
  CPack: Create package using WIX
  CPack: Install projects
  CPack: - Install project: colorconsoleapp [Debug]
  == Searching for shared DLL
  == Search completed
  == DLL Copying startedтАж
  Dependency copied: C:/projects/colortable_msvc/build/_deps/colorconsole-build/colorconsole.dll
  == DLL Copying finished
  CMake Error at C:/projects/colortable_msvc/build/cmake_install.cmake:152 (file):
    file INSTALL cannot find
    "C:/projects/colortable_msvc/build/libcolorconsole.dll": File exists.

Получим ошибку:

  CMake Error at C:/projects/colortable_msvc/build/cmake_install.cmake:152 (file):
    file INSTALL cannot find
    "C:/projects/colortable_msvc/build/libcolorconsole.dll": File exists.

Cmake не может найти файл

libcolorconsole.dll

так как MSVC собрал нашу библиотеку как:

colorconsole.dll

Несмотря на то, что мы указывали в предыдущей статье использовать префикс, приоритетными являются настройки CMake нашей программы.

Чтобы наша программа и библиотека использовали одинаковый подход к именованию библиотек нам нужно обновить конфигурацию CMake:

Откроем cmake\settings.cmake.in и добавим в конец файла:

# Задаем префикс библиотек при использовании компилятора MSVC
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # Будет устанавливаться только если компилятор - MSVC
    # Префикс для всех разделяемых (shared) библиотек
    set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
    # Префикс для всех статических библиотек
    set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
endif()

Запустим конфигурирование:

cmake -S . -B build

Запустим сборку:

cmake --build build
Версия MSBuild 17.14.23+b0019275e для .NET Framework

  1>Checking Build System
  Auto build dll exports
     Создается библиотека C:/projects/colortable_msvc/build/_deps/colorconsole-build/colorconsole.lib и объект C:/proje
  cts/colortable_msvc/build/_deps/colorconsole-build/colorconsole.exp
  colorconsole.vcxproj -> C:\projects\colortable_msvc\build\_deps\colorconsole-build\libcolorconsole.dll
  Building Custom Rule C:/projects/colortable_msvc/CMakeLists.txt
  LINK : не найден или не выполнена сборка C:\projects\colortable_msvc\build\Debug\colorconsoleapp.exe при последней инкрементной компоновке; выполняется полная компоновка
  colorconsoleapp.vcxproj -> C:\projects\colortable_msvc\build\Debug\colorconsoleapp.exe
  Building Custom Rule C:/projects/colortable_msvc/CMakeLists.txt

Запустим копирование .dll

cmake --build build --target=package
colorconsole.vcxproj -> C:\projects\colortable_msvc\build\_deps\colorconsole-build\libcolorconsole.dll
  colorconsoleapp.vcxproj -> C:\projects\colortable_msvc\build\Debug\colorconsoleapp.exe
  1>
  CPack: Create package using WIX
  CPack: Install projects
  CPack: - Install project: colorconsoleapp [Debug]
  == Searching for shared DLL
  == Search completed
  == DLL Copying startedтАж
  Dependency copied: C:/projects/colortable_msvc/build/_deps/colorconsole-build/libcolorconsole.dll
  == DLL Copying finished

Теперь файл с библиотекой у нас назван правильно:

libcolorconsole.dll

Давайте исправим вторую проблему – неправильную папку для сборки.

Откроем cmake\targets.cmake.in в конец файла добавим:

# Заставляем компилятор MSVC использовать папку build для сохранения .exe .dll .lib файлов, чтобы обеспечить
# совместимость c GCC
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # Будет устанавливаться только если компилятор - MSVC
   set_target_properties(${PROJECT_NAME} PROPERTIES
       RUNTIME_OUTPUT_DIRECTORY "$<IF:$<CONFIG:Debug>,${CMAKE_CURRENT_BINARY_DIR},${CMAKE_CURRENT_BINARY_DIR}>"
   )
   set_target_properties(${PROJECT_NAME} PROPERTIES
       LIBRARY_OUTPUT_DIRECTORY "$<IF:$<CONFIG:Debug>,${CMAKE_CURRENT_BINARY_DIR},${CMAKE_CURRENT_BINARY_DIR}>"
   )
   set_target_properties(${PROJECT_NAME} PROPERTIES
       ARCHIVE_OUTPUT_DIRECTORY "$<IF:$<CONFIG:Debug>,${CMAKE_CURRENT_BINARY_DIR},${CMAKE_CURRENT_BINARY_DIR}>"
   )
endif()

Запустим конфигурирование:

cmake -S . -B build

Запустим сборку:

cmake --build build
Версия MSBuild 17.14.23+b0019275e для .NET Framework

  Auto build dll exports
  colorconsole.vcxproj -> C:\projects\colortable_msvc\build\_deps\colorconsole-build\libcolorconsole.dll
colorconsoleapp.vcxproj -> C:\projects\colortable_msvc\build\colorconsoleapp.exe

Запустим:

cmake --build build --target=package

Попробуем запустить:

.\build\colorconsoleapp.exe

Программа запустилась успешно!

Заключение

Сегодня мы обновили проект CMake нашей программы colortable, для обеспечения совместимости с компилятором MSVC:

Загрузили исходный код из git-репозитория;

Добавили префикс для файла библиотеки;

Добавили настройки для компилятора MSVC.

Категория C++
Теги Cpp CMAKE msvc

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 122