链接(VS)

设置链接器选项:

可在开发环境内部或外部设置链接器选项。 每个链接器选项的主题讨论如何在开发环境中设置该选项。 有关完整的列表,请参见链接器选项。

当您在开发环境外部运行 LINK 时,可以用一种或多种方法指定输入:

在命令行上

使用命令文件

在环境变量中

LINK 首先处理在 LINK 环境变量中指定的选项,然后按照选项在命令行上和命令文件中的指定顺序处理这些选项。 如果某个选项带有多个不同的参数,则要优先处理最后一个参数。

选项将应用于整个生成;任何选项都不能应用于某个特定输入文件。

LINK.exe 将通用对象文件格式 (COFF) 对象文件和库链接起来,以创建可执行 (.exe) 文件或动态链接库 (DLL)。

链接器选项:
下表列出了 LINK.exe 的选项。 有关 LINK 的详细信息,请参阅:

编译器控制的 LINK 选项

LINK 输入文件
LINK 输出
保留字

在命令行上,链接器选项不区分大小写,例如,/base 和 /BASE 的含义相同。 有关如何在命令行或 Visual Studio 中指定每个选项的详细信息,请参阅适用于该选项的文档。

可以使用注释杂注指定一些链接器选项。

选项 目的
@ 指定响应文件。
/ALIGN 指定每一节的对齐方式。
/ALLOWBIND 指定 DLL 不能绑定。
/ALLOWISOLATION 指定清单查找的行为。
/APPCONTAINER 指定应用是否必须在 appcontainer 进程环境中运行。
/ASSEMBLYDEBUG 将 DebuggableAttribute 添加到托管映像中。
/ASSEMBLYLINKRESOURCE 创建指向托管资源的链接。
/ASSEMBLYMODULE 指定应将 Microsoft 中间语言 (MSIL) 模块导入到程序集中。
/ASSEMBLYRESOURCE 将托管资源文件嵌入程序集。
/BASE 为程序设置基址。
/CGTHREADS 设置 cl.exe 线程数以在指定链接时代码生成后用于优化和代码生成。
/CLRIMAGETYPE 设置 CLR 映像的类型(IJW、纯或安全)。
/CLRSUPPORTLASTERROR 保留通过 P/Invoke 机制调用的函数的上一个错误代码。
/CLRTHREADATTRIBUTE 指定要应用于 CLR 程序入口点的线程特性。
/CLRUNMANAGEDCODECHECK 指定链接器是否将 SuppressUnmanagedCodeSecurity 特性应用于链接器生成的、从托管代码调用到本机 DLL 中的 PInvoke 存根。
/DEBUG 创建调试信息。
/DEBUGTYPE 指定要包括在调试信息中的数据。
/DEF 将模块定义 (.def) 文件传递到链接器。
/DEFAULTLIB 在解析外部引用时搜索指定的库。
/DELAY 控制 DLL 的延迟加载。
/DELAYLOAD 导致延迟加载指定的 DLL。
/DELAYSIGN 对程序集进行部分签名。
/DLL 生成 DLL。
/DRIVER 创建内核模式驱动程序。
/DYNAMICBASE 使用地址空间布局随机化 (ASLR) 功能,指定是否生成可在加载时随机重新设定基址的可执行文件映像。
/ENTRY 设置起始地址。
/errorReport 向 Microsoft 报告内部链接器错误。
/EXPORT 导出函数。
/FIXED 创建只能在其首选基址加载的程序。
/FORCE 强制完成链接,即使符号无法解析或已定义多次。
/FUNCTIONPADMIN 创建可进行热修补的映像。
/GENPROFILE、/FASTGENPROFILE 这两个选项均通过链接器指定 .pgd 文件的生成,以支持按配置文件优化 (PGO)。 /GENPROFILE 和 /FASTGENPROFILE 使用不同的默认参数。
/GUARD 启用控制流防护保护。
/HEAP 设置堆的大小(以字节为单位)。
/HIGHENTROPYVA 指定对高熵 64 位地址空间布局随机化 (ASLR) 的支持。
/IDLOUT 指定 .idl 文件和其他 MIDL 输出文件的名称。
/IGNORE 禁止显示指定链接器警告的输出。
/IGNOREIDL 防止将特性信息处理到 .idl 文件中。
/IMPLIB 重写默认的导入库名。
/INCLUDE 强制符号引用。
/INCREMENTAL 控制增量链接。
/INTEGRITYCHECK 指定模块需要在加载时进行签名检查。
/KEYCONTAINER 指定用来对程序集进行签名的密钥容器。
/KEYFILE 指定用来对程序集进行签名的密钥或密钥对。
/LARGEADDRESSAWARE 通知编译器应用程序支持大于 2 GB 的地址
/LIBPATH 指定要在环境库路径之前搜索的路径。
/LTCG 指定链接时间代码生成。
/MACHINE 指定目标平台。
/MANIFEST 创建并行清单文件,也可以选择将其嵌入二进制文件。
/MANIFESTDEPENDENCY 在清单文件中指定 <dependentAssembly> 节。
/MANIFESTFILE 更改清单文件的默认名称。
/MANIFESTINPUT 指定链接器要进行处理并嵌入二进制文件的清单输入文件。 可以多次使用此选项以指定多个清单输入文件。
/MANIFESTUAC 指定是否将用户帐户控制 (UAC) 信息嵌入到程序清单中。
/MAP 创建映射文件。
/MAPINFO 包括映射文件中的指定信息。
/MERGE 合并节。
/MIDL 指定 MIDL 命令行选项。
/NOASSEMBLY 取消创建 .NET Framework 程序集。
/NODEFAULTLIB 在解析外部引用时忽略所有(或指定的)默认库。
/NOENTRY 创建纯资源 DLL。
/NOLOGO 取消显示启动版权标志。
/NXCOMPAT 将可执行文件标记为经验证与 Windows 数据执行保护功能兼容。
/OPT 控制 LINK 优化。
/ORDER 按预先确定的顺序将 COMDAT 放置到映像中。
/OUT 指定输出文件名。
/PDB 创建程序数据库 (PDB) 文件。
/PDBALTPATH 使用备用位置来保存 PDB 文件。
/PDBSTRIPPED 创建没有私有符号的程序数据库 (PDB) 文件。
/PGD 为按配置文件优化指定 .pgd 文件。
/PROFILE 生成一个可与“性能工具”探查器结合使用的输出文件。
/RELEASE 在 .exe 标头中设置校验和。
/SAFESEH 指定映像将包含安全异常处理程序表。
/SECTION 重写节的特性。
/STACK 设置堆栈的大小(以字节为单位)。
/STUB 将 MS-DOS 存根程序附加到 Win32 程序。
/SUBSYSTEM 通知操作系统如何运行 .exe 文件。
/SWAPRUN 通知操作系统在运行链接器输出之前将其复制到一个交换文件。
/TLBID 指定链接器生成的类型库的资源 ID。
/TLBOUT 指定 .tlb 文件和其他 MIDL 输出文件的名称。
/TSAWARE 创建专为在终端服务器下运行而设计的应用程序。
/VERBOSE 打印链接器进度消息。
/VERSION 分配版本号。
/WINMD 允许生成 Windows 运行时元数据文件。
/WINMDFILE 指定由 /WINMD 链接器选项生成的 Windows 运行时元数据 (winmd) 输出文件的文件名。
/WINMDKEYFILE 指定用来对 Windows 运行时元数据文件进行签名的密钥或密钥对。
/WINMDKEYCONTAINER 指定用来对 Windows 元数据文件进行签名的密钥容器。
/WINMDDELAYSIGN 通过将公钥放置在 winmd 文件中,对 Windows 运行时元数据 (winmd) 文件进行部分签名。
/WX 将链接器警告视为错误。

模块定义 (.def) 文件

模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成 DLL 时,.def 文件最有用。 由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。 也可以将 __declspec(dllexport) 用作指定导出函数的手段。

在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。

如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。

有关示例,请参见使用 DEF 文件从 DLL 导出。
模块定义语句的规则
EXPORTS
HEAPSIZE
LIBRARY
NAME
SECTIONS
STACKSIZE
STUB
VERSION
保留字

链接器的延迟加载 DLL 支持

Visual C++ 链接器现在支持 DLL 的延迟加载。 这使您不必再用 Windows SDK 函数 LoadLibrary 和 GetProcAddress 来实现 DLL 延迟加载。

在 Visual C++ 6.0 版之前,在运行时加载 DLL 的唯一办法是使用 LoadLibrary 和 GetProcAddress 函数;当使用操作系统的可执行文件或 DLL 被加载之后,操作系统才加载 DLL。

从 Visual C++ 6.0 开始,与 DLL 静态链接时,链接器提供了一些选项,将 DLL 的加载延迟到程序调用该 DLL 中的函数时才进行。

应用程序可以使用具有 Helper 函数的 /DELAYLOAD(延迟加载导入)链接器选项延迟加载 DLL(Visual C++ 提供的默认实现)。 Helper 函数将在运行时通过调用 LoadLibrary 和 GetProcAddress 为您加载 DLL。


在下列情况下,应考虑延迟加载 DLL:


程序可能不调用 DLL 中的函数。


可能直到程序执行后期才调用 DLL 中的函数。


可在 .EXE 或 .DLL 项目生成过程中指定延迟加载 DLL。 延迟加载一个或多个 DLL 的 DLL 项目本身不应调用 Dllmain 中的延迟加载入口点。


下列主题描述延迟加载 DLL:


指定要延迟加载的 DLL


显式卸载延迟加载的 DLL


加载被延迟加载的 DLL 的所有导入


绑定导入


错误处理和通知

转储延迟加载的导入

延迟加载 DLL 的约束

了解 Helper 函数

开发您自己的 Helper 函数


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值