Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3547|回复: 0
打印 上一主题 下一主题

obj到lib

[复制链接]

1272

主题

2067

帖子

7964

积分

认证用户组

Rank: 5Rank: 5

积分
7964
跳转到指定楼层
楼主
发表于 2020-1-28 21:22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        c/c++源程序
--编译器(VC的cl.exe)-----
        汇编语言源程序
--汇编器(assembler)----
机器指令(.obj)
--链接器(linker)----
可执行程序(.exe)

即:
从C/C++源程序到可执行文件要经历两个阶段1)编译器将源文件编译成汇编代码,
然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出的目标文件默认的后缀名是.obj)中;
(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。

编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。
详细参看:未整理\VC\uafxcwd.lib(wincore.obj)  error LNK2005 _IsPlatformNT 已经在 PPTooltip.obj 中定义 [产生原因.doc]

ANSI C/C++ 的标准函数的提供
它们又分布在许多不同的目标文件中,如果直接以目标文件的形式提供给程序员使用的话,就需要他们确切地知道哪个函数存在于哪个目标文件中,
并且在链接时显式地指定目标文件名才能成功地生成可执行文件,显然这是一个巨大的负担。
所以C语言提供了一种将多个目标文件打包成一个文件的机制,这就是静态程序库(static library)。----(.lib)

开发者在链接时只需指定程序库的文件名,链接器就会自动到程序库中寻找那些应用程序确实用到的目标模块,并把(且只把)它们从库中拷贝出来参与构建可执行文件。
几乎所有的C/C++开发系统都会把标准函数打包成标准库提供给开发者使用
--------------即源码调用标准库函数后,是在机器语言级到相应的库文件中连接相应的库函数生成的库,进一步构造可执行程序-------------------
----至于包含整个库后,会不会把库中的所有函数都连接到自己的exe程序中,如下:
一定不会的。只要稍微好一点的编译器,都会知道将没有使用的函数抛弃!
例如VC编译器,可以通过显式的指令链接选项来将没有用使用的函数不链接进程序中,从而大幅度的减小程序的体积。/OPT:REF



静态链接:
  链接程序搜索一个或者多个库文件(标准库.lib),直到在某个库中找到了含有所引用函数的对象模块,然后链接程序把这个对象模块拷贝到结果可执行文件(.exe)中。链接程序维护对该函数的所有引用,使它们指向该程序中现在含有该函数拷贝的地方。

动态链接:
  链接程序也是搜索一个或者多个库文件(输入库.lib),当在某个库中找到了所引用函数的输入记录时,便把输入记录拷贝到结果可执行文件中,产生一次对该函数的动态链接。这里,输入记录不包含函数的代码或者数据,而是指定一个包含该函数代码以及该函数的顺序号或函数名的动态链接库。

---如生成静态库的uwayutil工程,其它程序采用静态链接后,生成的可执行程序目录下并不再需要uwayutil.lib或uwayutil.dll(当然若工程生成静态库也不会生成dll文件)
---其它工程要调用静态库,直接加上相应的头文件目录  并引入相应的.lib库
---或 #pra....



/ML、
/MLd、
/MT、
/MTd、
/MD、
/MDd

/d  _DEBUG宏
/M  标准库
/L  单线程
/T  多线程


VC带的编译器名字叫cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。
这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);
/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),
编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,
因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,
DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库,可是当编译器干完了活,
轮到链接器开工时它又如何得知一个个目标文件到底在思念谁?为了传递相思,我们的编译器就干了点秘密的勾当。
在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息,
其中有一种就叫缺省库(default library),这些信息指定了一个或多个库文件名,
告诉链接器在扫描的时候也把它们加入到输入文件列表中(当然顺序位于在命令行中被指定的输入文件之后)。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 15:09 , Processed in 0.057928 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表