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. omnibus gitlab-ce安装

    架构 关闭防火墙 [root@gitlab ~]# systemctl stop firewalld [root@gitlab ~]# systemctl disable firewalld 关闭SE ...

  2. P4factory ReadMe 剩余部分

    Building and Running a Target Each P4 program (called a 'target') is set up in a directory under tar ...

  3. Spring Cloud 开发的一些推荐规划

    1.提供一个统一的 父 pom 依赖    作用:统一版本与引入必要依赖 2.提供一个模板模型. 作用: 开发人员不必关系具体基础启动项 3.提供一个统一基础配置模型 作用: 开发人员不比太过关注与必 ...

  4. UVa 11732 strcmp()函数(左孩子右兄弟表示法)

    #include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...

  5. C#SendMessage用法

    C#SendMessage用法 分类: C#操作内存相关 2011-11-26 23:52 1255人阅读 评论(0) 收藏 举报 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口 ...

  6. java中字面量,常量和变量之间的区别(附:Integer缓存机制)

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  7. 构建工具 Ant、Maven和Gradle

    构建工具的作用 依赖管理 测试,打包,发布 主流的构建工具 Ant:提供编译,测试,打包 Maven:在Ant的基础上提供了依赖管理和发布的功能 Gradle:在Maven的基础上使用Groovy管理 ...

  8. 玲珑杯 round18 A 计算几何瞎暴力

    题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...

  9. 阿里云服务器购买 发布web项目全过程

    http://blog.csdn.net/liona_koukou/article/details/50496946

  10. POJ 3414 dfs 回溯

    题目链接:http://poj.org/problem?id=3414 题意:三个值A, B, C, A和B是两个杯子的容量,问最短操作数使A或者B里的水量是C.有三种操作. 思路:dfs.暴力 很简 ...