深入探究VC —— 链接器link.exe(4)
在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具。
link.exe的输入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而输出的文件一般是exe文件、dll文件、sys文件等可执行程序文件。
1、命令行参数
link.exe运行参数如下:
LINK [options] files
参数包括选项和文件名,选项和文件名可按任意顺序指定。link会首先处理选项,然后是文件。各参数间必须使用一个或多个空格或制表符来分隔。
2、输入文件
参数中的files是指链接器的输入文件。用户可以使用文件名指定绝对路径或相对路径,可在文件名中使用通配符。如果用户指定的文件名没有扩展名,则默认假设扩展名为obj。link.exe对文件格式的判断不是根据文件扩展名,而是判断文件的内容。
比如之前【深入探究VC —— 编译器cl.exe(1)】代码中:
// File Name: Hello.c
// Description: First Win32 Application
// by Koma 2009-11-18 22:05
#include <windows.h>
#pragma comment(lib,"user32.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int cmdShow)
{
MessageBox(NULL,"Hello World !","Test",MB_OK);
return 0;
}
Hello.c完成编译后会生成Hello.obj文件,然后将Hello.obj与系统库文件链接起来,最终生成可执行文件。命令行参数为:
link Hello.obj /subsystem:windows
注意,在之前【深入探究VC —— 编译器cl.exe(1)】代码中有这样一行代码:
#pragma comment(lib,"user32.lib")
如果在输入文件中指明了user32.lib,那么这一行是没有必要的。但是如果将参数里这一段链接user32.lib去掉,而代码文件中又不包括 上面这一行,则
如果编译器报告错误“LNK2019:无法解析的外部符号......”,那么通常是由于没有将链接这些符号所需要的输入库文件加入到输入文件参数中,比如调用MessageBox API就必须在链接时输入user32.lib。
3、链接器选项
选项前需加“选项说明符”(一个短划线‘-’或一个正斜杠‘/’),然后是该选项的名称。如果选项带参数,参数在冒号(:)后指定选项的参数。如果参数是数值,可以使用十进制、或C语言表示法。与编译器cl.exe不同,链接器的选项名及其关键字或文件名参数不区分大小写,但用作参数的标识符区分大小字书。
选项中很多涉及Windows可执行文件的格式问题,比如节、导入表、导出表、基地址等,以及Windows可执行文件中EXE文件、DLL文件的区别与作用、可执行文件的加载以及API函数动态链接过程。(Windows可执行文件编译与链接的内部原理,请自行查阅相关资料吧!)
选项
用途
@
指定响应文件
/ALIGN
指定每一节的对齐方式
/ALLOWBIND
指定 DLL 不能绑定
/ALLOWISOLATION
指定清单查找的行为。
/ASSEMBLYDEBUG
将 DebuggableAttribute 添加到托管映像中。
/ASSEMBLYLINKRESOURCE
创建指向托管资源的链接。
/ASSEMBLYMODULE
指定应将 Microsoft 中间语言 (MSIL) 模块导入到程序集中
/ASSEMBLYRESOURCE
将托管资源文件嵌入到程序集
/BASE
为程序设置基址
/CLRIMAGETYPE
设置 CLR 映像的类型(IJW 映像、纯映像或安全映像)。
/CLRSUPPORTLASTERROR
保留通过 P/Invoke 机制调用的函数的上一个错误代码。
/CLRTHREADATTRIBUTE
指定要应用于 CLR 程序入口点的线程属性。
/CLRUNMANAGEDCODECHECK
/CLRUNMANAGEDCODECHECK 指定链接器是否将 SuppressUnmanagedCodeSecurity 属性应用于链接器生成的、从托管代码调用到本机 DLL 中的 PInvoke 存根 (stub)。
/DEBUG
创建调试信息
/DEF
将模块定义 (.def) 文件传递到链接器
/DEFAULTLIB
在解析外部引用时搜索指定的库
/DELAY
控制 DLL 的延迟加载
/DELAYLOAD
导致延迟加载指定的 DLL
/DELAYSIGN
对程序集进行部分签名。
/DLL
生成 DLL
/DRIVER
创建 Windows NT 核心模式驱动程序
/DYNAMICBASE
使用 Windows Vista 的地址空间布局随机化 (ASLR) 功能,指定是否生成可在加载时随机重新设定基址的可执行文件映像。
/ENTRY
设置起始地址
/errorReport
向 Microsoft 报告内部链接器错误。
/EXPORT
导出函数
/FIXED
创建只能在其首选基址加载的程序
/FORCE
强制完成链接,即使符号无法解析或已定义多次
/FUNCTIONPADMIN
创建可热修补的映像。
/HEAP
设置堆的大小(以字节为单位)
/IDLOUT
指定 .idl 文件和其他 MIDL 输出文件的名称
/IGNOREIDL
防止将属性信息处理到 .idl 文件中
/IMPLIB
重写默认的导入库名
/INCLUDE
强制符号引用
/INCREMENTAL
控制增量链接
/KEYCONTAINER
指定用来为程序集签名的密钥容器。
/KEYFILE
指定用来为程序集签名的密钥或密钥对。
/LARGEADDRESSAWARE
通知编译器应用程序支持大于 2 GB 的地址
/LIBPATH
允许用户重写环境库路径
/LTCG
指定链接时代码生成
/MACHINE
指定目标平台
/MANIFEST
创建并行清单文件。
/MANIFESTDEPENDENCY
在清单文件中指定 <dependentAssembly> 节。
/MANIFESTFILE(命名清单文件)
更改清单文件的默认名称。
/MANIFESTUAC
指定是否将用户帐户控制 (UAC) 信息嵌入到程序清单中。
/MAP
创建映射文件
/MAPINFO
包括映射文件中的指定信息
/MERGE
合并节
/MIDL
指定 MIDL 命令行选项
/NOASSEMBLY
取消创建 .NET Framework 程序集
/NODEFAULTLIB
在解析外部引用时忽略所有(或指定的)默认库
/NOENTRY
创建纯资源 DLL
/NOLOGO
取消显示启动版权标志
/NXCOMPAT
将可执行文件标记为经测试与 Windows 数据执行保护功能兼容。
/OPT
控制 LINK 优化
/ORDER
按预先确定的顺序将 COMDAT 放置到图像中
/OUT
指定输出文件名
/PDB
创建程序数据库 (PDB) 文件
/PDBSTRIPPED
创建没有私有符号的程序数据库 (PDB) 文件
/PGD
为按配置文件优化指定 .pgd 文件。
/PROFILE
生成一个可与“性能工具”探查器结合使用的输出文件。
/RELEASE
在 .exe 文件头中设置校验和
/SAFESEH
指定图像将包含安全异常处理程序表。
/SECTION
重写节的属性
/STACK
设置堆栈的大小(以字节为单位)
/STUB
将 MS-DOS 存根 (stub) 程序附加到 Win32 程序
/SUBSYSTEM
通知操作系统如何运行 .exe 文件
/SWAPRUN
通知操作系统在运行链接器输出之前将其复制到一个交换文件
/TLBID
允许指定链接器生成的类型库的资源 ID
/TLBOUT
指定 .tlb 文件和其他 MIDL 输出文件的名称
/TSAWARE
创建专为在终端服务器下运行而设计的应用程序
/VERBOSE
打印链接器进度消息
/VERSION
分配版本号
/WX
将链接器警告视为错误。
4、参考资料
微软官方MSDN帮助文档
有关更多信息,请参见编译器控制的 LINK 选项、 设置链接器选项、有关生成的常见问题.
本文来自CSDN博客,转载请标明出处:http://www.cnblogs.com/lidabo/admin/file:///C:/Documents%20and%20Settings/Administrator/桌面/MFC-20100806文章/MFC-20100806文章/深入探究VC%20——%20链接器link_exe(4)%20-%20zxzqwq2009的专栏%20-%20CSDN博客.htm
深入探究VC —— 链接器link.exe(4)的更多相关文章
- 链接器link.exe 编译器cl.exe 资源编译器rc.exe
原文地址:https://blog.csdn.net/biggbang/article/details/24433065 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译 ...
- Windows应用程序的VC链接器设置
Windows应用程序的VC链接器设置 /*转载请注明出自 听风独奏 www.GbcDbj.com */ Windows应用程序分为GUI(Graphical User Interface)和CUI( ...
- 深入探究VC —— 资源编译器rc.exe(3)
Windows应用程序中,图标.菜单.畏途.图标.工具条.对话框等是以资源的形式存在的.开发人员也可以自定义资源类型.如果一个程序使用了资源,那么它在构建时需要对资源进行编译.程序所使用的资源会在资源 ...
- VC++ 链接错误LINK : fatal error LNK1104: cannot open file "*.lib"
问题描述: 运行VC++编译时经常出现 Linking… LINK : fatal error LNK1104: cannot open file “*.lib” Error executing li ...
- 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事
2.1.3 我的父亲母亲:编译器和链接器 从表面上看,我是由Visual Studio创建的,而实际上,真正负责编译源代码创建生成可执行程序HelloWorld.exe的却是Visual Studi ...
- 深入探究VC —— 编译器cl.exe(2)
这一章节介绍的全是VC编译器选项,option参数是cl.exe的编译选项,是cl.exe命令行参数中最复杂.也是最常用的.下面介绍一些常用的编译选项: 1.代码生成有关 这些选项将影响编译完成后生成 ...
- 深入探究VC —— 编译器cl.exe(1)
cl.exe的功能是将源代码文件编译为可提供链接器使用的obj对象文件.cl.exe命令行参数形式如下: CL (option...) file... [option | file]... [lib. ...
- 【亲测有效】无法定位链接器!请检查 tools\link.ini 中的配置是否正确的解决方案
在进行易语言静态编译的时候,出现了如下错误: 正在进行名称连接...正在统计需要编译的子程序正在编译...正在生成主程序入口代码程序代码编译成功等待用户输入欲编译到的文件名正在进行名称连接...开始静 ...
- 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败
今天下午搞易语言,在编写动态链接库以后,静态编译的时候出现以下提示: 无法定位链接器!请检查 tools\link.ini 中的配置是否正确. 静态连接失败 于是网上百度了下,找到相关的解决方法: 编 ...
随机推荐
- Spring Boot简介
Spring Boot简介 Spring Boot是为了简化Spring开发而生,从Spring 3.x开始,Spring社区的发展方向就是弱化xml配置文件而加大注解的戏份.最近召开的SpringO ...
- python的Error集,17个新手常见Python运行时错误
python及相关工具安装Error集 . 如果升级python版本中出现error .so.1.0: cannot open shared object file: No such file or ...
- 中国天气网API
中国天气网有三个 API 适用于不同场合的使用. http://m.weather.com.cn/data/101050101.html 这个接口返回的格式如下. { "weatherinf ...
- c++的正整数高精度加减乘除
数值计算之高精度加减乘除 一. 高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主 ...
- java 构造函数是如何执行的
1.构造函数不是方法!! 原因1:方法的话,会直接执行方法体内的代码,但是构造函数首先执行的不是{}里的代码块,而是给对象的成员初始化: 2.方法可以被调用其他方法调用,但是构造函数不能被方法或变量调 ...
- CSS3线性渐变linear-gradient
转自 http://www.w3cplus.com/content/css3-gradient CSS3的线性渐变 一.线性渐变在Mozilla下的应用 -moz-linear-gradient( [ ...
- Map 的遍历
一.Map的遍历 在后面java的开发过程中会遇到Map类的使用,然而map的遍历是一大问题. Map遍历用两种比较交代的方法: package edu.map; import java.util.H ...
- Software Version --hdu1976
#include using namespace std; int main() { int T; cin>>T; int a1,b1,c1; int a2,b2,c2; while(T- ...
- HDU1004题解分析(字符串处理)
这道题是从上个星期开始做的,看到题时觉得似曾相似,好像做过,理了一下思路敲完代码又不对,后来发现是数组用错了,之后又重新想了数组和比较用法,昨天改了一个多小时,后来样例输出全部正确,所有情况都考虑到了 ...
- [C++参考]拷贝构造函数的参数必须是引用类型
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识.在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的.但是为什么呢? ...