Собираем программу 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=packagecolorconsole.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.
Добавить комментарий