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

自定义C++框架Nexus下Sandbox项目LNK2019未解析main符号错误

链接错误:未解析的外部符号main

错误信息

MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
D:\Cpp..Engine\bin\Debug-x64\SandBox\SandBox.exe : fatal error LNK1120: 1 个无法解析的外部命令
Done building project "SandBox.vcxproj" -- FAILED.

项目结构

解决方案包含两个项目:

  • Nexus(DLL项目):

    • 包含文件:
      • Core.h
      • Application.h
      • Application.cpp(定义Application类)
    • 设置:
      • 项目类型:动态链接库(DLL)
      • 预处理器定义:NX_BUILD_DLL、NX_PLATFORM_WINDOWS
  • Sandbox(应用程序项目):

    • 包含文件:
      • Sandbox.cpp(实现客户端应用)
      • 包含Nexus框架的头文件(Core.h、Application.h、EntryPoint.h)
    • 设置:
      • 项目类型:应用程序(.exe)
      • 子系统:控制台
      • 预处理器定义:NX_PLATFORM_WINDOWS

源代码

Core.h

#pragma once

#ifdef NX_PLATFORM_WINDOWS
    #ifdef NX_BUILD_DLL
        #define NEXUS_API __declspec(dllexport)
    #else
        #define NEXUS_API __declspec(dllimport)
    #endif // NX_BUILD_DLL
#else
    #error NEXUS only supports Windows!
#endif // NX_PLATFORM_WINDOWS

Application.h

#pragma once
#include "Core.h" 

namespace Nexus {
    class NEXUS_API Application
    {
    public:
        Application();
        virtual ~Application();

        void Run();
    };
    Application* CreateApplication(); // 由客户端实现
}

EntryPoint.h

#pragma once

#ifdef NX_PLATFORM_WINDOWS

extern Nexus::Application* Nexus::CreateApplication();

int main(int argc, char** argv)
{
    auto app = Nexus::CreateApplication();
    app->Run();
    delete app;
}

#endif // NX_PLATFORM_WINDOWS

Nexus.h

#pragma once

// 供Nexus应用使用
#include "Nexus/Application.h"
#include "Nexus/EntryPoint.h"

Sandbox.cpp

#include <Nexus.h>

class Sandbox : public Nexus::Application
{
public:
    Sandbox() {
        // Sandbox初始化代码
    }

    ~Sandbox() {
        // Sandbox清理代码
    }
};

Nexus::Application* Nexus::CreateApplication() {
    return new Sandbox();
}

Application.cpp

#include "Application.h"

namespace Nexus {
    Application::Application() {}

    Application::~Application() {}

    void Application::Run() {
        while (true);
    }
}

项目配置

  • Sandbox项目设置为应用程序(.exe)
  • 子系统配置为控制台
  • 预处理器定义包含NX_PLATFORM_WINDOWS

补充信息

  • CreateApplication函数在Sandbox.cpp中定义正确
  • 已验证NEXUS_API宏应用正确
  • Nexus项目构建无问题
  • 已多次清理并重新生成解决方案,但错误仍存在
  • 文件结构:
    文件结构

解决方案

原因分析

链接器找不到main函数,核心原因是EntryPoint.h中的main函数未被正确编译进Sandbox项目,大概率是条件编译或头文件包含环节出了问题。

修复步骤

  1. 确认NX_PLATFORM_WINDOWS预定义生效
    打开Sandbox项目属性 -> C/C++ -> 预处理器,检查NX_PLATFORM_WINDOWS是否存在且拼写正确。若该宏未定义,EntryPoint.h中的main会被条件编译跳过,导致项目无入口函数。

  2. 检查头文件包含路径
    确认Sandbox项目的附加包含目录已添加Nexus框架的根目录,确保#include <Nexus.h>能正确找到文件,进而包含EntryPoint.h。

  3. 直接引入EntryPoint.h
    若间接包含失效,可在Sandbox.cpp中直接添加#include "Nexus/EntryPoint.h",强制编译main函数。

  4. 验证子系统配置
    进入项目属性 -> 链接器 -> 系统,确认子系统为控制台 (/SUBSYSTEM:CONSOLE),而非Windows (/SUBSYSTEM:WINDOWS)(后者会寻找WinMain而非main)。

  5. 彻底清理重建

    • 删除Sandbox项目的Debug/Release目录
    • 执行菜单 -> 项目 -> 清理解决方案
    • 先重新生成Nexus项目,再生成Sandbox项目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:44:51