自定义C++框架Nexus下Sandbox项目LNK2019未解析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.hApplication.hApplication.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项目,大概率是条件编译或头文件包含环节出了问题。
修复步骤
确认
NX_PLATFORM_WINDOWS预定义生效
打开Sandbox项目属性 -> C/C++ -> 预处理器,检查NX_PLATFORM_WINDOWS是否存在且拼写正确。若该宏未定义,EntryPoint.h中的main会被条件编译跳过,导致项目无入口函数。检查头文件包含路径
确认Sandbox项目的附加包含目录已添加Nexus框架的根目录,确保#include <Nexus.h>能正确找到文件,进而包含EntryPoint.h。直接引入
EntryPoint.h
若间接包含失效,可在Sandbox.cpp中直接添加#include "Nexus/EntryPoint.h",强制编译main函数。验证子系统配置
进入项目属性 -> 链接器 -> 系统,确认子系统为控制台 (/SUBSYSTEM:CONSOLE),而非Windows (/SUBSYSTEM:WINDOWS)(后者会寻找WinMain而非main)。彻底清理重建
- 删除Sandbox项目的
Debug/Release目录 - 执行菜单 -> 项目 -> 清理解决方案
- 先重新生成Nexus项目,再生成Sandbox项目
- 删除Sandbox项目的
内容的提问来源于stack exchange,提问作者Ainz

