深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452在程序编译完成后,生成的文件是以.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)】代码中:
Hello.c完成编译后会生成Hello.obj文件,然后将Hello.obj与系统库文件链接起来,最终生成可执行文件。命令行参数为: link Hello.obj /subsystem:windows
注意,在之前【深入探究VC —— 编译器cl.exe(1)】代码中有这样一行代码:
如果在输入文件中指明了user32.lib,那么这一行是没有必要的。但是如果将参数里这一段链接user32.lib去掉,而代码文件中又不包括 上面这一行,则编译器会报错。
如果编译器报告错误“LNK2019:无法解析的外部符号......”,那么通常是由于没有将链接这些符号所需要的输入库文件加入到输入文件参数中,比如调用MessageBox API就必须在链接时输入user32.lib。
3、链接器选项 选项前需加“选项说明符”(一个短划线‘-’或一个正斜杠‘/’),然后是该选项的名称。如果选项带参数,参数在冒号(:)后指定选项的参数。如果参数是数值,可以使用十进制、或C语言表示法。与编译器cl.exe不同,链接器的选项名及其关键字或文件名参数不区分大小写,但用作参数的标识符区分大小字书。
选项中很多涉及Windows可执行文件的格式问题,比如节、导入表、导出表、基地址等,以及Windows可执行文件中EXE文件、DLL文件的区别与作用、可执行文件的加载以及API函数动态链接过程。(Windows可执行文件编译与链接的内部原理,请自行查阅相关资料吧!)
4、参考资料
有关更多信息,请参见编译器控制的 LINK 选项、 设置链接器选项、有关生成的常见问题. |
|