c++使用静态库和直接使用源码有什么区别
1个回答
展开全部
基本上没有区别。如果非要说有区别的话,就是你要把另一个项目的代码扔到自己的项目中,没有经过./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链接是完全一样的。
没有用到的符号将会被自动削除,所以跟直接从源码编译相比,也不会对体积有影响。
为什么说没有区别的呢?我们来看看一般多文件编译的过程:
编译器将每一个源文件.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链接是完全一样的。
没有用到的符号将会被自动削除,所以跟直接从源码编译相比,也不会对体积有影响。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询