You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake设置管理员权限及解决C++20链接错误求助

解决MinGW环境下CMake设置管理员权限的链接错误

问题根源

你使用的是MinGW编译器(从构建日志里的mingw/bin/g++.exe和ld.exe可看出),但参考的是MSVC编译器的链接选项语法。MinGW的链接器不识别/MANIFESTUAC、/SUBSYSTEM:WINDOWS这类MSVC风格的参数,会把它们当成要链接的文件路径,因此报错“找不到文件”。

修复方案

1. 准备Manifest和资源文件

在项目根目录创建两个文件:

app.manifest(用于指定UAC权限):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application>
    </compatibility>
</assembly>

app.rc(用于将manifest嵌入程序):

1 24 "app.manifest"

2. 修改CMake配置

替换原有的LINK_FLAGS设置,改用CMake跨平台属性和条件编译,同时将资源文件加入目标:

cmake_minimum_required(VERSION 3.26)
project(quizee)
Include(FetchContent)

FetchContent_Declare(
        SDL2
        GIT_REPOSITORY https://github.com/libsdl-org/sdl
        GIT_TAG release-2.28.x
        GIT_SHALLOW TRUE)

if(NOT SDL2_POPULATED)
    FetchContent_Populate(SDL2)
    add_subdirectory(${sdl2_SOURCE_DIR} ${sdl2_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

FetchContent_MakeAvailable(SDL2)

add_subdirectory(extern/glad)

set(CMAKE_CXX_STANDARD 20)

# 用WIN32属性声明这是Windows窗口程序,CMake会自动处理子系统选项(替代手动加/SUBSYSTEM或-mwindows)
add_executable(quizee WIN32 main.cpp app.rc)

# 针对不同编译器设置UAC权限
if(MSVC)
    # MSVC环境下保留原有的MANIFESTUAC设置
    SET_TARGET_PROPERTIES(quizee PROPERTIES LINK_FLAGS "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\"")
elseif(MINGW)
    # MinGW通过app.rc和app.manifest实现管理员权限,无需额外链接选项
endif()

# 设置SDL和glad的头文件目录
target_include_directories(${PROJECT_NAME} PUBLIC ${SDL2_SOURCE_DIR}/include extern/glad/include)

# 设置SDL库目录
target_link_directories(${PROJECT_NAME} PUBLIC ${SDL2_BINARY_DIR})

# 链接静态SDL2和glad库
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2-static glad )

关键说明

  • WIN32属性:让CMake自动根据编译器生成对应子系统选项(MSVC用/SUBSYSTEM:WINDOWS,MinGW用-mwindows),避免手动写平台相关参数。
  • MinGW下的UAC权限:必须通过manifest文件嵌入程序,直接用链接选项无效,因此用rc资源文件将manifest打包进可执行文件。

内容的提问来源于stack exchange,提问作者chrischtel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:00:06