Собираем библиотеку C++ написанную под GCC c помощью MSVC и CMake
Для бесплатного использования компанией Microsoft создана Visual Studio Community. Это бесплатная IDE для разработки и набор инструментария, включая компилятор, для сборки программ, в том числе на С++. Сегодня мы рассмотрим сборку нашей библиотеки C++ с помощью MSVC компилятора от Microsoft и её обновление, для совместимости с проектами и GCC и MSVC.
Тестовый макет
Сегодня мы рассмотрим такую ситуацию – на ПК установлен только Visual Studio Community и нашей задачей является собрать версию библиотеки ColorConsole, а затем и саму программу с помощью CMake и компилятора cl.
На ПК установлены, с помощью Visual Studio Installer:
Visual Studio Community
MSVC версии 143
SDK для Windows версии 10
Git для Windows
CMakeИ тут у нас возникают проблемы, так как инструментарий от Microsoft, как всегда, требует дополнительных усилий, для сборки сторонних библиотек, особенно для тех, что разрабатывались для GCC.
Настройка проекта
Мы будем использовать определенный коммит git-репозитория:
cd c:\projects
git clone https://gitflic.ru/project/vasiliyaltunin/color-console-library.git
cd c:\projects\color-console-library
git checkout b2c1983b3e00076a357884cf15461aa958de85efПопробуем запустить конфигурирование:
cmake -S . -B build-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.20348.0 to target Windows 10.0.19045.
-- The CXX compiler identification is MSVC 19.41.34120.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.41.34120/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
BUILD_SHARED_LIBS=ON
=== Library build set to SHARED
=== Settings setup complete
Library will be build as SHARED
=== Building EXTERNAL docs
=== Doxygen config generated
=== Libconf settings complete
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
CMake Error at examples/basic/CMakeLists.txt:9 (add_executable):
Syntax error in cmake code when parsing string
..\..\src\colorconsole.h
Invalid character escape '\s'.
CMake Error at examples/basic/CMakeLists.txt:9 (add_executable):
Syntax error in cmake code when parsing string
..\..\src\colorconsole.cpp
Invalid character escape '\s'.
-- Configuring incomplete, errors occurred!Мы получили ошибку:
Syntax error in cmake code when parsing string
..\..\src\colorconsole.cpp
Invalid character escape '\s'.Всё дело в том, что в CMake, независимо от платформы, всегда нужно использовать в пути файлов обратный слэш - /
Изменим конфигурацию примеров, чтобы исправить ошибку.
Откроем файл color-console-library\examples\basic\CMakeLists.txt
Заменим содержимое на:
cmake_minimum_required(VERSION 3.16)
project(basicexample VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(${PROJECT_NAME}
../../src/colorconsole.h
../../src/colorconsole.cpp
main.cpp
)
include(GNUInstallDirs)Мы заменили:
..\\..\\src\\colorconsole.h
..\\..\\src\\colorconsole.cppНа:
../../src/colorconsole.h
../../src/colorconsole.cppТакие изменения нужно произвести в папках:
color-console-library\examples\color_table
color-console-library\examples\Russia_flagСнова запустим конфигурирование:
cd c:\projects\color-console-librarycmake -S . -B build-- Selecting Windows SDK version 10.0.20348.0 to target Windows 10.0.19045.
BUILD_SHARED_LIBS=ON
=== Library build set to SHARED
=== Settings setup complete
Library will be build as SHARED
=== Building EXTERNAL docs
=== Doxygen config generated
=== Libconf settings complete
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
=== Targets settings complete
=== Install settings complete
-- Configuring done (0.1s)
-- Generating done (0.1s)
-- Build files have been written to: C:/Projects/color-console-library/buildНа этот раз библиотека сконфигурировалась без ошибок.
Запустим сборку:
cmake --build buildВерсия MSBuild 17.11.2+c078802d4 для .NET Framework
1>Checking Build System
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txt
colorconsole.cpp
colorconsole.vcxproj -> C:\Projects\color-console-library\build\Debug\colorconsole.dll
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txtСборка прошла успешно.
Создание файла .lib в проектах CMake и MSVC
Если мы сейчас попробуем собрать с нашей библиотекой программу, то получим ошибку о не найденном файле colorconsole.lib.
По умолчанию MSVC не создает .lib файлы при сборке библиотек с помощью CMake. Чтобы включить принудительное создание этого файла откроем cmake\settings.cmake.in:
Добавим в конец строку:
# Застявляем компилятор MSVC создавать .lib файл
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)Запустим конфигурирование:
cmake -S . -B buildЗапустим сборку:
cmake --build buildВерсия MSBuild 17.11.2+c078802d4 для .NET Framework
Auto build dll exports
Создается библиотека C:/Projects/color-console-library/build/Debug/colorconsole.lib и объект C:/Projects/color-console-library/build/Debug/colorconsole.exp
colorconsole.vcxproj -> C:\Projects\color-console-library\build\Debug\colorconsole.dllСтрока:
Создается библиотека C:/Projects/color-console-library/build/Debug/colorconsole.lib и объект C:/Projects/color-console-library/build/Debug/colorconsole.expПоказывает, что теперь так же создается файл colorconsole.lib
Изменяем пути для размещения результатов сборки
Мы успешно собрали библиотеку, но есть небольшая проблема:
colorconsole.vcxproj -> C:\Projects\color-console-library\build\Debug\colorconsole.dllВместо папки build компилятор MSVC поместил библиотеку в папку build\Debug
Нам нужно добавить опции для CMake, которые укажут компилятору какую папку использовать.
Откроем файл \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.11.2+c078802d4 для .NET Framework
1>Checking Build System
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txt
colorconsole.cpp
Auto build dll exports
Создается библиотека C:/Projects/color-console-library/build/colorconsole.lib и объект C:/Projects/color-console-library/build/colorconsole.exp
colorconsole.vcxproj -> C:\Projects\color-console-library\build\colorconsole.dll
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txtПроверим:
dir /w .\build\colorconsole.*
[colorconsole.dir] colorconsole.dll colorconsole.exp colorconsole.lib colorconsole.pdb colorconsole.sln
colorconsole.vcxproj colorconsole.vcxproj.filtersВсе файлы созданы в одной папке!
Изменяем префикс для при использовании MSVC
Если мы внимательно посмотрим на результат сборки:
Создается библиотека C:/Projects/color-console-library/build/colorconsole.lib и объект C:/Projects/color-console-library/build/colorconsole.exp
colorconsole.vcxproj -> C:\Projects\color-console-library\build\colorconsole.dllТо заметим что имена файлов библиотек:
colorconsole.lib
colorconsole.dllне совпадают с именами, получившимися при сборке с использованием GCC:
libcolorconsole.lib
libcolorconsole.dllЧтобы в дальнейшем не было проблем, унифицируем имена файлов.
Откроем 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.11.2+c078802d4 для .NET Framework
1>Checking Build System
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txt
colorconsole.cpp
Auto build dll exports
Создается библиотека C:/Projects/color-console-library/build/colorconsole.lib и объект C:/Projects/color-console-library/build/colorconsole.exp
colorconsole.vcxproj -> C:\Projects\color-console-library\build\libcolorconsole.dll
Building Custom Rule C:/Projects/color-console-library/CMakeLists.txtТеперь имена файлов совпадают.
Заключение
Сегодня мы обновили проект CMake нашей библиотеки C++, для обеспечения совместимости с компилятором MSVC:
Загрузили исходный код из git-репозитория;
Попробовали его собрать с помощью MSVC и получили ошибку;
Исправили пути до файлов;
Успешно собрали проект;
Принудительно включили создание .lib файлов при сборке библиотеки в Windows;
Изменили пути размещения результата сборки при использовании MSVC.
Добавить комментарий