关于动态链接和静态链接……

匿名人士 发布于 2012/03/08 17:12
阅读 723
收藏 0

我知道在多个应用程序中同时用到一个库,用动态链接比较好

如果有这样一个库,每个函数存在一份源文件中,然后编译产生目标文件,并且静态链接成静态库,如果我只用到其中一个函数,应用程序是否只包含了需要的那些目标文件进去而不带不需要的?还是说整个静态库全带进去了?

另外win下经常将 kernel32,user32,ole32 全部动态链接进去,在不需要的情况下是否根本就没有链接?

对编译原理不是太懂,请教。

加载中
0
andmz
andmz

静态连接的话,执行体“包含"了库,执行到的时候从内存取。

动态连接的话,执行体没"包含"库,执行到的时候从库中取。

等带高人解释。。

 

 

0
FreeZ
FreeZ

1)只包含了需要的那些目标文件进去而不带不需要的

你可以找个静态库自己试试,比如sqlite3.lib只用sqlite_version(),看看最终exe的大小。

2)不需要的情况下根本就没有链接

这个用PE编辑器就可以看到了。

0
leo108
leo108
win下那个情况,怎么会不需要呢,你绘制一个界面都是需要win的库的
0
匿名人士
匿名人士

引用来自“FreeZ”的答案

1)只包含了需要的那些目标文件进去而不带不需要的

你可以找个静态库自己试试,比如sqlite3.lib只用sqlite_version(),看看最终exe的大小。

2)不需要的情况下根本就没有链接

这个用PE编辑器就可以看到了。

嗯,你说到了Sqlite3,我有一个问题

如果我用sqlite的amalgamation包,所有代码在一个源文件里,静态引用sqlite_version()会不会很大?因为我感觉静态连接是按目标文件包含的。

0
FreeZ
FreeZ

引用来自“leo108”的答案

win下那个情况,怎么会不需要呢,你绘制一个界面都是需要win的库的
怎么不会呢 比如我写一个只简单输出"hello,world!"的控制台程序,为什么要链接gdi32,ole32等库呢。找个控制台程序,看IAT就知道了。
0
FreeZ
FreeZ

引用来自“吀夜”的答案

引用来自“FreeZ”的答案

1)只包含了需要的那些目标文件进去而不带不需要的

你可以找个静态库自己试试,比如sqlite3.lib只用sqlite_version(),看看最终exe的大小。

2)不需要的情况下根本就没有链接

这个用PE编辑器就可以看到了。

嗯,你说到了Sqlite3,我有一个问题

如果我用sqlite的amalgamation包,所有代码在一个源文件里,静态引用sqlite_version()会不会很大?因为我感觉静态连接是按目标文件包含的。

嗯 amalgamation会导致exe很大。。。
0
中山野鬼
中山野鬼
静态链接是把对应函数链接进去。但是所有依赖的函数也需要并进去。不需要的函数,不会,但不需要和不直接调用是完全两件事情。动态链接和静态链接在链接过程中是有本质区别的,除非特别讲究效率的时候,建议还是动态折腾。不建议使用静态库。这对你后期软件维护模块开发改动,有影响。
返回顶部
顶部