Windows应用程序的VC链接器设置
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链接器设置的更多相关文章
- 深入探究VC —— 链接器link.exe(4)
在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...
- Windows 通过本地计算机IP链接Mysql设置
前言 1.Mysql-1130错误:无法远程连接 错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL se ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
- Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows
创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- C++应用程序在Windows下的编译、链接(一)概述
C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- 原创 C++应用程序在Windows下的编译、链接(四)动态链接
4动态链接 4.1概述 在静态链接阶段,链接器为PE文件生成了导入表,导出表,符号表,并调整了Call指令后面的操作数,在程序调用的时候,能够直接地或者间接地定位到IAT中的某个位置,在PE文件中,该 ...
- VC菜菜鸟:建立第一个基于Visual C++的Windows窗口程序
建立第一个基于VisualC++的Windows窗口程序: 发表于:http://blog.csdn.net/it1988888/article/details/10306585 a)执行命令:新建 ...
随机推荐
- Linux基础入门第三节(修改)
第三节 作业部分 添加一个用户loutest,使用sudo创建文件/opt/forloutest,设置成用户loutest可以读写.截图并把操作过程写入实验报告. 找到了解决的办法,在touch命令前 ...
- HeyWeGo小组团队项目管理
HeyWeGo团队小组项目管理 项目内容 使用java程序开发一款扫雷游戏 实现计划 第一周 明确项目内容.目标.分工,以及完成前期的一些准备 建立新的小组博客以及创建新的代码托管链接 第二周 实行初 ...
- C#中的静态构造函数
https://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.140).aspx A static constructor is used to ini ...
- python 列表字符串元素乱序
from random import shuffle color = ['] shuffle(color) print(color)
- Phpstorm Alt+Enter 自动导入类
很方便!!!能够自动提示哪些类没有自动加载!!!然后Alt+Enter进行安装!!!
- SQL Server2012创建约束图解
SQLServer中有五种约束:Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束 1 . Primary Key 约束 在 ...
- JAVA消息 JMS 很重要
首先大致讲一下,java 消息模块 消息,个人理解分为两种:1.同步消息(RPC调用) 2.异步消息(本篇讲解部分) 一.同步消息java提供了多种方案: 最新比较常用的方式就是spring Http ...
- 雷林鹏分享:Ruby 数组(Array)
Ruby 数组(Array) Ruby 数组是任何对象的有序的.整数索引的集合.数组中的每个元素都与一个索引相关,并可通过索引进行获取. 数组的索引从 0 开始,这与 C 或 Java 中一样.一个负 ...
- arcgis api for silverlight开发系列之二:缓存图层与动态图层及图层总结 .
本文摘自:http://blog.csdn.net/leesmn/article/details/6916458(很优秀的博客) 作为ESRI的平台的一份子arcgis api for silve ...
- <p>1、查询端口号占用,根据端口查看进程信息</p>
2017年6月份的时候,我就着手在公司推广git,首先我自己尝试搭建了GitLab来管理代码,并且通过以下博客记录了GitLab的搭建,以及GitLab备份,GitLab升级等事情. git学习——& ...