Windows上通过CMake构建MFC项目示例

      在Windows上通过CMak构建MFC项目示例如下:

      首先使用VS2022创建一个对话框项目MFCApplication1,不做任何修改,然后将默认生成的文件:*.h, *.cpp, *.rc, *.ico拷贝到一个干净的目录下,如下图所示:

      build.sh内容如下:

#! /bin/bash

if [ $HOSTTYPE != "x86_64" ]; then
    echo_error "only support x86_64 architecture: current architecture: $HOSTTYPE"
fi

if [[ "$OSTYPE" != "msys" ]] && [[ "$OSTYPE" != "cygwin" ]]; then
    echo_error "unsupported platform: $OSTYPE"
    exit -1
fi

result_judgment()
{
    rc=$?
    if [[ ${rc} != 0 ]]; then
        echo -e "\033[0;31mError: there are some errors in the above operation, please check: ${rc}\033[0m"
        exit ${rc}
    fi
}

echo_error()
{
    echo -e "\033[0;31mError: $1\033[0m"
}

if [ $# != 1 ]; then
    echo_error "requires a parameter: Release or Debug\n  For example: $0 Debug"
    exit -1
fi

if [ $1 != "Release"  ] && [ $1 != "Debug" ]; then
    echo_error "the parameter can only be Release or Debug"
    exit -1
fi

mkdir -p target && cd target

cmake \
    -G"Visual Studio 17 2022" -A x64 \
    -DCMAKE_BUILD_TYPE=$1 \
    -DCMAKE_CONFIGURATION_TYPES=$1 \
    ..
result_judgment

cmake --build . --target install --config $1 #--verbose
result_judgment
cd ../

echo -e "\033[0;32mbuild completed\033[0m"

      CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.21.0)
project(MFCApplication1)

set(CMAKE_MFC_FLAG 1) # 1: use static MFC library; 2: use shared MFC library

message(STATUS "build type: ${CMAKE_BUILD_TYPE}")
if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
    # set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /W1 /Ox") # not recommended, use target_compile_options
    message(STATUS "cmake_cxx_flags_release: ${CMAKE_CXX_FLAGS_RELEASE}")
else()
    # set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 /Od") # not recommended, use target_compile_options
    message(STATUS "cmake_cxx_flags_debug: ${CMAKE_CXX_FLAGS_DEBUG}")
endif()

message(STATUS "current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
set(CMAKE_CXX_STANDARD 20) # C++20

set(INCLUDES
    include
)

set(SRCS
    src/MFCApplication1.cpp
    src/MFCApplication1Dlg.cpp
    src/pch.cpp
)

set(RESOURCES
    src/MFCApplication1.rc
    src/res/MFCApplication1.rc2
    src/res/MFCApplication1.ico
)

# set install path
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/install/${CMAKE_BUILD_TYPE}" CACHE PATH "" FORCE)
message(STATUS "cmake_install_prefix: ${CMAKE_INSTALL_PREFIX}")

add_executable(${PROJECT_NAME} WIN32
    ${SRCS}
    ${RESOURCES}
)
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDES})
target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE)
target_compile_options(${PROJECT_NAME} PRIVATE
    $<$<CONFIG:Debug>:/W4 /Od /MTd>
    $<$<CONFIG:Release>:/W1 /Ox /MT>
)

source_group("Resource Files" FILES ${RESOURCES})

install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})

      编译、运行结果如下图所示:

      说明:

      1.CMAKE_MFC_FLAG:CMake的内置变量,用于对可执行文件或DLL启用MFC(Microsoft Foundation Classes)库。使用MFC静态库设置为1,使用MFC动态库库设置为2。此设置要与运行库匹配,即设置为1,则运行库为/MT或/MTd;设置为2,则运行库为/MD或/MDd。

      2.add_executable中WIN32选项:不指定时入口点为main,生成控制台应用程序;指定时入口点为WinMain,生成GUI(MFC)应用程序。

      3.target_compile_definitions中指定_UNICODE项:指定时字符集使用Unicode字符集,不指定时使用多字节字符集。不推荐使用add_definitions,它是全局设置。

      4.可以通过内置变量CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG来查看编译选项,要想查看更详细更准确编译选项,可以在cmake时增加--version项

      5.可以通过target_compile_options设置编译选项,如警告等级、优化等级等。不推荐使用CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG,它们是全局设置。

      GitHubhttps://github.com/fengbingchun/Linux_Code_Test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值