c++使用静态库和直接使用源码有什么区别

 我来答
硪丨暧恋
2017-08-07 · TA获得超过8980个赞
知道大有可为答主
回答量:5336
采纳率:93%
帮助的人:2182万
展开全部
基本上没有区别。如果非要说有区别的话,就是你要把另一个项目的代码扔到自己的项目中,没有经过./configure之类的步骤,一些开关(一般是config.h里的宏)没有开启,然后导致编译出来不同。又或者说在别的机器上编译完的静态库搬到自己的机器上,别人的编译器版本比较新优化得比较好,又或者说别人的编译器架构和平台根本不同然后不能用。也就这些很显然的区别了。

为什么说没有区别的呢?我们来看看一般多文件编译的过程:

编译器将每一个源文件.cpp都编译成一个目标文件.o。目标文件里面有符号表,记录着函数和它所用到的符号、全局变量等等。
链接器将所有的.o链接成系统可辨认的二进制文件,或者说“映像”。链接器将各个函数重新排列(Reallocation),然后将没有用到的函数舍弃。

即便是加入静态库仍然没有什么区别,因为:静态库本身就只不过是.o文件的一个打包(Archive)。以GCC的ar为例,我们看看静态库.a里面究竟是什么:
$ ar -t libfltk.a
Fl.o
Fl_Adjuster.o
Fl_Bitmap.o
Fl_Browser.o
Fl_Browser_.o
Fl_Browser_load.o
Fl_Box.o
Fl_Button.o
Fl_Chart.o
Fl_Check_Browser.o
Fl_Check_Button.o
Fl_Choice.o
Fl_Clock.o
Fl_Color_Chooser.o
Fl_Copy_Surface.o
Fl_Counter.o
Fl_Dial.o
Fl_Device.o
Fl_Double_Window.o
Fl_File_Browser.o
Fl_File_Chooser.o
Fl_File_Chooser2.o
Fl_File_Icon.o
Fl_File_Input.o
Fl_Group.o
Fl_Help_View.o
Fl_Image.o
Fl_Image_Surface.o
...

真相就是,里面就是一大堆的.o。从源代码编译(第一步)也是生成一大堆.o,从静态库里解包也是生成一大堆相同的.o,其余的步骤完全是没有区别的。换句话说,比如你有一个libexample.a,它里面有src1.o和src2.o两个目标文件。你在链接的时候用ld -lexample开关链接一个静态库,和你先用ar -x libexample.a解包,然后用ld src1.o src2.o链接是完全一样的。

没有用到的符号将会被自动削除,所以跟直接从源码编译相比,也不会对体积有影响。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式