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

使用wmain作为入口点时CMake无法构建项目的问题

问题:使用wmain作为入口点时出现链接错误

将main替换为wmain作为程序入口后,构建时出现以下链接错误:

[build] /usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/Scrt1.o: in function _start': [build] (.text+0x1b): undefined reference to main'

环境信息:

  • 系统:Manjaro Linux 23
  • IDE:Code OSS
  • 语言:C++
  • 构建系统:CMake 3.27.8

当前CMakeLists.txt内容:

cmake_minimum_required(VERSION 3.5.0)
project(CMake_Project VERSION 0.1.0 LANGUAGES C CXX)

include(CTest)
enable_testing()

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED True) 

add_executable(CMake_Project Odd_Element.cpp)
add_subdirectory(UOutput)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
解决方案
  • Linux环境不支持wmain作为标准入口:wmain是Windows平台特有的宽字符入口函数,Linux系统的C++运行时和链接器默认仅识别main作为程序入口,这是链接错误的核心原因。
  • 处理宽字符命令行参数的标准方式:在Linux下直接使用main入口,通过本地化设置和字符转换函数处理宽字符需求,示例代码:
#include <iostream>
#include <locale>
#include <cstdlib>

int main(int argc, char** argv) {
    std::setlocale(LC_ALL, ""); // 初始化本地化环境以支持宽字符编码
    for (int i = 0; i < argc; ++i) {
        wchar_t w_arg[1024];
        mbstowcs(w_arg, argv[i], sizeof(w_arg)/sizeof(wchar_t));
        std::wcout << L"参数" << i << L": " << w_arg << std::endl;
    }
    return 0;
}
  • 强制指定入口点(不推荐):若坚持使用wmain,可通过CMake向链接器传递参数手动指定入口符号,在add_executable后添加:
target_link_options(CMake_Project PRIVATE -Wl,-e,wmain)

该方式违反Linux平台标准规范,可能引发兼容性问题,仅作临时测试使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:32:44