Windows应用程序的VC链接器设置

/*转载请注明出自 听风独奏 www.GbcDbj.com */

Windows应用程序分为GUI(Graphical User Interface)和CUI(Console User Interface)程序,很多人却会误认为Windows程序就是GUI程序。

很多初学者使用Microsoft Visual Studio 编写程序时经常会错误地创建程序类型,导致出现”unresolved external symbol”的错误,原因在于Visual C++的链接器开关设置问题。该开关在: 项目属性->链接器->系统->子系统。

首先,创建GUI程序,对应开关设置为: WINDOWS(/SUBSYSTEM:WINDOWS),创建CUI程序则对应:控制台(/SUBSYSTEM:CONSOLE),都已默认选择的了。

其次,对应GUI程序的入口点函数为_tWinMain,而CUI则为mian。然而系统并不真正调用这两个入口点函数,他们是由”可执行文件的启动函数调用”,而启动函数系系统根据链接器开关的设置来选择加载哪一个启动函数,启动函数与入口点函数之间的调用必须正确对应,认识这一点很重要!

函数类型和入口点函数,启动函数之间的对应关系:

应用程序类型              - 入口点函数                -嵌入的可执行文件启动函数

ANSIC版本的GUI程序      - _tWinMain(WinMain)         - WinMainCRTStartup

UNICODE版本的GUI程序   - _tWinMain(WinMain)         - wWinMainCRTStartup

ANSIC版本的CUI程序      - _tmain(Main)                - mainCRTStartup

UNICODE版本的CUI程序   - _tmain(Main)                - mainCRTStartup

现在认识清楚了错误原因后,我们来一起分析下错误和如何去修改:

现在假如一个程序员想在控制台程序下调用MFC和Win32API函数时,他会创建一个Win32应用项目,即GUI程序,然后编写main入口点函数。

首先链接可执行文件时候,链接器会根据链接器子系统开关设置选择正确的启动函数,由于GUI程序对应开关(默认)为WINDOWS(/SUBSYSTEM:WINDOWS),则链接器根据他加载WinMainCRTStartup或者wWinMainCRTStartup,然后会寻找WinMain或者wWinMain入口点函数,并且由启动函数调用。

但是,程序员写的是main函数,于是出现了” unresolved external symbol”, 或者无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用。

如何修改?只需修改链接器子系统的开关:

main作为入口点函数的则选择:

控制台(/SUBSYSTEM:CONSOLE),

_tWinMain作为入口点函数则选择:

WINDOWS(/SUBSYSTEM:WINDOWS)。

更通用的方法是:把该开关选择为未设置,则链接器会根据入口点函数类型,选择正确的启动函数。

/*转载请注明出自 听风独奏www.GbcDbj.com */

Windows应用程序的VC链接器设置的更多相关文章

  1. 深入探究VC —— 链接器link.exe(4)

    在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...

  2. Windows 通过本地计算机IP链接Mysql设置

    前言 1.Mysql-1130错误:无法远程连接 错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL se ...

  3. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构

    2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...

  4. Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows

    创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...

  5. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  6. C++应用程序在Windows下的编译、链接(一)概述

    C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...

  7. 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)

    3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...

  8. 原创 C++应用程序在Windows下的编译、链接(四)动态链接

    4动态链接 4.1概述 在静态链接阶段,链接器为PE文件生成了导入表,导出表,符号表,并调整了Call指令后面的操作数,在程序调用的时候,能够直接地或者间接地定位到IAT中的某个位置,在PE文件中,该 ...

  9. VC菜菜鸟:建立第一个基于Visual C++的Windows窗口程序

    建立第一个基于VisualC++的Windows窗口程序: 发表于:http://blog.csdn.net/it1988888/article/details/10306585 a)执行命令:新建 ...

随机推荐

  1. Cooperation.GTST团队第四周项目总结

    项目进展 这周我们的主要学习内容是: 1.研究学习如何导入博客详情页. 2.继续研究如何使用博客园的相关接口,导入相关jar包实现页面整体效果: 在我们使用其它APP或者上网浏览论坛.网页等时,通常都 ...

  2. java读取pdf总结

    第三方软件 1.pdfbox PDFBox 0.7.3.PDFBox是一个开源的对pdf文件进行操作的库. PDFBox-0.7.3.jar加入classpath.同时FontBox1.0.jar加入 ...

  3. linux内核源码在线浏览

    1.https://elixir.bootlin.com  (只能搜索函数和宏定义,功能单一) 2.https://lxr.missinglinkelectronics.com (比第一个功能多一些, ...

  4. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  5. MyBatis获取SqlSession

    package com.ykmimi.dao; import org.apache.ibatis.session.SqlSession; import com.ykmimi.entity.Studen ...

  6. CF_400_D

    codeforces_400_D 题目大意:给出n扇门,m把钥匙,和没把钥匙可以改变状态(关->开,开->关>)的门的数量及对应编号(保证每个门被两把钥匙控制),现给出n扇门的初始状 ...

  7. 面向对象之php多态

    php是面向对象的脚本语言,而我们都知道,面向对象的语言具有三大特性:封装,继承,多态(接口的多种不同的实现方式即为多态). 封装是类的构建过程,php具有.php也具有继承的特性.唯独这个多态,ph ...

  8. 使用由 Intel MKL 支持的 R

    我们通常使用的 R 版本是单线程的,即只使用一个 CPU 线程运行所有 R 代码.这样的好处是运行模型比较简单且安全,但是它并没有利用多核计算.Microsoft R Open(MRO,https:/ ...

  9. Android:你好,androidX!再见,android.support

    1.AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物.由于之前的suppor ...

  10. 流行得前端构建工具比较,以及gulp配置

    前端现在三足鼎立的构建工具(不算比较老的ant,yeoman),非fis,grunt,gulp莫属了. fis用起来最简单,我打算自己得项目中使用一下fis. 先说一下gulp安装吧. 第一步:安装n ...