我可以从命令行构建 MFC 应用程序吗?

Posted

技术标签:

【中文标题】我可以从命令行构建 MFC 应用程序吗?【英文标题】:Can I build an MFC app from the command line? 【发布时间】:2012-10-11 01:46:34 【问题描述】:

我拥有所有必需的 MFC 库,它们都在一个名为“atlmc”的目录中。我从http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/c8556098-6f41-42cb-9de6-38ed24c3faf9 复制了一个简单的 helloworldmfc.cpp

代码如下:

#include <afxwin.h>

  class HelloApplication : public CWinApp
  
  public:     
   virtual BOOL InitInstance();
  ;

  HelloApplication HelloApp;

  class HelloWindow : public CFrameWnd
          
   CButton* m_pHelloButton;
  public:     
   HelloWindow();
  ;


  BOOL HelloApplication::InitInstance()
          
   m_pMainWnd = new HelloWindow();       
   m_pMainWnd->ShowWindow(m_nCmdShow);      
   m_pMainWnd->UpdateWindow();      
   return TRUE;
  


  HelloWindow::HelloWindow()
          
   Create(NULL,             
    "Hello World!",               
    WS_OVERLAPPEDWINDOW|WS_HSCROLL,                
    CRect(0,0,140,80));        
   m_pHelloButton = new CButton();
   m_pHelloButton->Create("Hello World!",WS_CHILD|WS_VISIBLE,CRect(20,20,120,40),this,1);
  

我已经链接了链接器要求的每个库文件等,它们有很多。这是我的构建命令:

C:\Users\Scruffy\Desktop\MSVC>Bin\cl.exe hellomfc.cpp /EHsc /I atlmfc\include /I 包含 /I Includes\Winsdk atlmfc\lib\amd64\nafxcw.lib 库\libcmt.lib 库\Kernel32.Lib 库\User32.Lib 库\Gdi32.Lib 库\MSImg32.Lib 库\ComDlg32.Lib 库 s\WinSpool.Lib 库\AdvAPI32.Lib 库\Shell32.Lib 库\ComCtl32.Lib 库\ShLwApi .Lib 库\Uuid.lib atlmfc\lib\amd64\atls.lib Libs\Ole32.Lib Libs\OleAut32.Lib Li bs\oldnames.lib Libs\WS2_32.Lib Libs\MsWSock.Lib Libs\OleAcc.Lib Libs\comsuppw.l ib Libs\GdiPlus.lib Libs\Imm32.Lib Libs\WinMM.Lib Libs\MsXml2.Lib Libs\OleDlg.Lib 库\Urlmon.Lib

编译器的响应抱怨找不到__tmainCRTStartup。以及关于 _WIN32_WINNT 未定义的其他一些事情,尽管这似乎只是一个警告,而不是错误。

这是我通过它运行构建命令后来自 cl.exe 的完整响应:

Microsoft (R) C/C++ 优化编译器版本 16.00.30319.01 for x64 版权所有 (C) 微软公司。保留所有权利。

hellomfc.cpp _WIN32_WINNT 未定义。默认为 _WIN32_WINNT_MAXVER(参见 WinSDKVer.h) Microsoft (R) 增量链接器版本 10.00.30319.01 版权所有 (C) 微软公司。保留所有权利。

/out:hellomfc.exe hellomfc.obj atlmfc\lib\amd64\nafxcw.lib 库\libcmt.lib 库\Kernel32.Lib 库\User32.Lib 库\Gdi32.Lib 库\MSImg32.Lib 库\ComDlg32.Lib 库\WinSpool.Lib 库\AdvAPI32.Lib 库\Shell32.Lib 库\ComCtl32.Lib 库\ShLwApi.Lib 库\Uuid.lib atlmfc\lib\amd64\atls.lib 库\Ole32.Lib 库\OleAut32.Lib 库\oldnames.lib 库\WS2_32.Lib 库\MsWSock.Lib 库\OleAcc.Lib 库\comsuppw.lib 库\GdiPlus.lib 库\Imm32.Lib 库\WinMM.Lib 库\MsXml2.Lib 库\OleDlg.Lib 库\Urlmon.Lib libcmt.lib(crt0.obj): 错误 LNK2019:函数中引用了未解析的外部符号 main __tmainCRTStartup hellomfc.exe : 致命错误 LNK1120: 1 unresolved externals

所以error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup hellomfc.exe : fatal error LNK1120: 1 unresolved externals 似乎是问题所在。这个错误基本上意味着编译器找不到入口点,不是吗?如果是这样,MFC 显然将其 WinMain 隐藏在框架中的某个位置。好的好的,我如何链接到它?

【问题讨论】:

看来您可能没有指定正确的目标平台(Windows vs Console)并且后者没有被链接。您是否尝试过 /SUBSYSTEM:WINDOWS 在您的命令行上告诉链接器哪个要使用的启动过程? @WhozCraig,不,我应该把 /SUBSYSTEM:WINDOWS 选项放在哪里?最后? 信息:使用/link /libpath:"path\to\libs" (source) 可以缩短命令行 信息:链接已失效。 Wayback Machine link. 【参考方案1】:

看来您可能没有指定正确的目标平台(Windows 与控制台),而后者没有被链接。

尝试在命令行中指定 /SUBSYSTEM:WINDOWS 以告诉链接器使用哪个启动过程。它是一个链接器标志,因此需要通过 /link 传递到链接阶段。

【讨论】:

以上是关于我可以从命令行构建 MFC 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以从命令行“安装” Xcode .mobileprovision 文件吗?

是否可以从命令行创建网站应用程序发布配置文件?

我无法从 android studio 构建或运行我的颤振应用程序,但它可以从命令行运行

我可以从 JDBC 连接运行“源”命令(SQL 脚本)吗?

您可以从 msbuild.exe 命令行关闭条件编译符号吗?

您可以从命令行更改 Micronaut 应用程序的功能吗?