Как включить MFC в сборку проекта CMake ninja с помощью Visual Studio 2019?

У меня есть структура проекта С++, например:

mfc_ninja
├── CMakeLists.txt
├── source.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)

project(mylib)

add_definitions(-D_AFXDLL)
set(CMAKE_MFC_FLAG 2)
add_library(${PROJECT_NAME} SHARED source.cpp)

source.cpp

#include <afxwin.h>

Я открываю каталог mfc_ninja с помощью Visual Studio 2019. Затем я иду в меню «Проект» и «Создать кеш», который работает, как и ожидалось. Когда я пытаюсь собрать проект, я получаю сообщение об ошибке:

Error C1083 Cannot open include file: 'afxwin.h': No such file or directory

У меня нет опыта работы с МФЦ. Я хочу перенести существующие решения Visual Studio на чистый CMake. Для исполняемых файлов я обнаружил, что вы должны определить add_executable с WIN32. Но для add_library этого не существует.

Как я могу создать библиотеку с чистым CMake против MFC?


Я обновил CMakeLists.txt, чтобы использовать FindMFC, как указано в комментариях:

cmake_minimum_required(VERSION 3.19)

project(mylib)

find_package(MFC REQUIRED)
message(STATUS "MFC_FOUND: ${MFC_FOUND}")

add_library(${PROJECT_NAME} SHARED source.cpp)

Выходы говорят мне, что MFC не найден им:

1> CMake generation started for default configuration: 'x64-Debug'.
1> Command line: "cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PROFESSIONAL\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe"  -G "Ninja"  -DCMAKE_BUILD_TYPE:STRING = "Debug" -DCMAKE_INSTALL_PREFIX:PATH = "C:\Users\benjamin.buch\source\repos\mfc_ninja\out\install\x64-Debug" -DCMAKE_C_COMPILER:FILEPATH = "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH = "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe"  -DCMAKE_MAKE_PROGRAM = "C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PROFESSIONAL\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" "C:\Users\benjamin.buch\source\repos\mfc_ninja" 2>&1"
1> Working directory: C:\Users\benjamin.buch\source\repos\mfc_ninja\out\build\x64-Debug
1> [CMake] -- The C compiler identification is MSVC 19.28.29915.0
1> [CMake] -- The CXX compiler identification is MSVC 19.28.29915.0
1> [CMake] -- Detecting C compiler ABI info
1> [CMake] -- Detecting C compiler ABI info - done
1> [CMake] -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe - skipped
1> [CMake] -- Detecting C compile features
1> [CMake] -- Detecting C compile features - done
1> [CMake] -- Detecting CXX compiler ABI info
1> [CMake] -- Detecting CXX compiler ABI info - done
1> [CMake] -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe - skipped
1> [CMake] -- Detecting CXX compile features
1> [CMake] -- Detecting CXX compile features - done
1> [CMake] -- Looking for MFC
1> [CMake] -- Looking for MFC - not found
1> [CMake] -- MFC_FOUND: NO
1> [CMake] -- Configuring done
1> [CMake] -- Generating done
1> [CMake] -- Build files have been written to: C:/Users/benjamin.buch/source/repos/mfc_ninja/out/build/x64-Debug
1> Extracted CMake variables.
1> Extracted source files and headers.
1> Extracted code model.
1> Extracted includes paths.
1> CMake generation finished.

Что меня также немного смущает, так это то, что, несмотря на REQUIRED, это не прерывается с сообщением об ошибке.

На мой взгляд, поскольку CMake обычно используется для кроссплатформенного кода, а приложение MFC не может работать в Linux или другой ОС, на самом деле лучше использовать VS напрямую.

kiner_shah 11.04.2023 12:34

@kiner_shah В настоящее время мы рефакторим наш код, чтобы избавиться именно от этого. MFC должен исчезнуть в долгосрочной перспективе. Новый проект в настоящее время существует только как версия CMake. Но теперь есть косвенная зависимость от этого устаревшего кода.

Benjamin Buch 11.04.2023 12:37

Я предлагаю создать простое приложение MFC через VS и посмотреть, какие там настройки (включая пути, библиотеки и т. д.). Затем копирование этих путей в CMake и тестирование.

kiner_shah 11.04.2023 12:39

Проекту не удается установить включаемый каталог ATL/MFC. Я не знаю, как это делается, но, возможно, достаточно простого FindMFC.

IInspectable 11.04.2023 12:42

@kiner_shah (гипотетическая) идея использовать CMake для кроссплатформенного кода редко является движущей силой для использования CMake. Это также дает преимущества для одноплатформенной разработки. Вы научитесь ценить это, если вам когда-либо приходилось объединять сценарии MSBuild на основе XML и разрешать конфликты слияния. Я потерял изрядную долю ума из-за того, что делал это в прошлом.

IInspectable 11.04.2023 12:46

@IInspectable, я могу это понять. Я нахожу CMake очень удобным, но в прошлом я испытывал головную боль при настройке CMake для Windows.

kiner_shah 11.04.2023 12:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы использовать MFC с CMake, его необходимо установить с помощью установщика Visual Studio.

К сожалению, у меня есть только немецкий скриншот установщика:

Поскольку REQUIRED не работает с FindMFC, это должно быть проверено явно.

cmake_minimum_required(VERSION 3.19)

project(mylib)

find_package(MFC)
if (NOT MFC_FOUND)
    message(FATAL_ERROR "MFC was not found, please install Desktop development with C++ / MFC for newest build tools")
endif ()

add_library(${PROJECT_NAME} SHARED source.cpp)

Причина, по которой мой проект VS, скомпилированный ранее, не имеет ничего общего с MFC. Файл, который включает MFC, был в файловой системе, но не был частью проекта VS и поэтому не был там скомпилирован. Вот почему это, казалось, работало с проектом VS.

«Решения Visual Studio используют какой-то встроенный MFC» — не совсем так. Скорее MFC развертывается как часть Visual Studio. Файлы заголовков и библиотеки (импорт) устанавливаются в каталог установки VS. Не существует поддерживаемого способа установки MFC в качестве отдельной библиотеки. В качестве отступления: я не считаю, что «ASP.NET» является обязательным требованием, о чем свидетельствует сообщение об ошибке.

IInspectable 11.04.2023 16:43

@IInspectable Я дважды проверяю часть ASP, и вы правы, это разработка для настольных компьютеров на C++. исправлю, спасибо! Что касается заголовков, я посмотрел в каталоге установки и не нашел файла с подходящим названием. Поэтому подозрение, что они как-то встроены.

Benjamin Buch 11.04.2023 17:50

Заголовки ATL/MFC устанавливаются в «<Каталог установки VS>\VC\Tools\MSVC\<версия>\atlmfc\include\». Дважды проверьте, находитесь ли вы в правильном каталоге. Также обратите внимание, что вы можете изменить язык вашей установки VS, не переустанавливая все это (хотя я не знаю, относится ли это также к установщику Visual Studio).

IInspectable 11.04.2023 19:10

@IInspectable После установки они были на этом месте, а не раньше. НО: тем временем я заметил, что файл, содержащий заголовок MFC, находится в каталоге, но не является частью проекта VS. Другими словами, проект вообще не использует MFC. Каталог просто не был очищен. Так что никакого зловещего встраивания действительно нет.

Benjamin Buch 11.04.2023 19:27

Другие вопросы по теме