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

简介: 在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具。 link.exe的输入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而输出的文件一般是exe文件、dll文件、sys文件等可执行程序文件。

在程序编译完成后,生成的文件是以.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

目录
相关文章
|
存储 缓存 应用服务中间件
Docker 镜像解密:分层存储与镜像构建原理
Docker 镜像解密:分层存储与镜像构建原理
1111 0
|
存储 Kubernetes 关系型数据库
|
人工智能 IDE API
白板秒变IDE,草图直接生成可运行代码!Pad.ws:白板+代码编辑器深度结合,创意到实现无缝衔接
Pad.ws是一款创新的在线开发环境,将交互式白板与完整IDE工具深度结合,支持多人实时协作和多种编程语言,无需安装即可通过浏览器访问。
1149 1
白板秒变IDE,草图直接生成可运行代码!Pad.ws:白板+代码编辑器深度结合,创意到实现无缝衔接
|
9月前
|
机器学习/深度学习 编解码 机器人
YOLOv11 改进 - C2PSA | C2PSA融合Mask Attention掩码注意力,可学习掩码矩阵破解低分辨率特征提取难题 | 2025 预印
本文提出MaskAttn-UNet,融合卷积效率与注意力全局视野,通过可学习掩码选择性关注关键区域,提升低分辨率图像分割精度。模块集成至YOLOv11,兼顾性能与效率,适用于资源受限场景,在多任务中表现优异。
YOLOv11 改进 - C2PSA | C2PSA融合Mask Attention掩码注意力,可学习掩码矩阵破解低分辨率特征提取难题 | 2025 预印
|
12月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
1218 4
|
人工智能 安全 Cloud Native
|
监控 供应链 数据库连接
电商API:销量监控与竞品分析利器
电商数据接口API在现代电商运营中至关重要,可实现品牌价格、销量、评论等数据监控,优化销售策略。接入主流平台如淘宝、天猫、京东等API,或使用RPA技术取数,保障数据安全与效率。通过数据库连接、ERP直连等方式整合分析数据,监控竞品与价格,掌握市场动态。同时,注重数据安全性、技术支持及成本效益,助力企业在竞争中脱颖而出,提升业务效率与竞争力。
|
存储 算法 Java
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
1219 0
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
分布式计算 资源调度 Java
Spark安装教程
该教程详细介绍了在Linux环境下安装Spark 3.1.2的步骤。首先,检查JDK版本需为1.8。接着,下载Spark资源并设置环境变量`SPARK_HOME`。配置`spark-env.sh`和`yarn-site.xml`文件,禁用内存检查。然后,重启Hadoop集群,启动Spark集群,并通过`jps -ml`检查Spark Master和Worker。可以通过Web UI访问Spark状态,并使用`spark-shell`测试Scala交互环境及Spark on Yarn。最后,学习如何关闭Spark集群。
1349 2
Spark安装教程

热门文章

最新文章