Linux 相关编译知识

瘦欲@ 提交于 2020-03-05 04:46:00

  一直对编译的过程概念很模糊,总结记录一下方便以后复习。

  Linux下gcc编译器使用:

  gcc编译流程:

1、预处理        gcc -E hello.c -o hello.i        对包含的头文件和宏定义进行处理

2、编译         gcc -s hello.i  -o hello.s         检查代码的规范性,是否有语法错误,把代码翻译成汇编语言

3、汇编         gcc -c hello.s -o hello.o        汇编语言转成二进制目标代码

4、链接         gcc hello.o -o hello              

 

 

 

 

  

  上述流程中的第四步链接阶段,涉及到一个概念:函数库

  函数库分为静态库和动态库两种。静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件较大,但是在运行时不再需要库文件,

其后缀名为“.a”。动态库是在程序执行的时候加载库,这样可以节省开销,后缀名为".so"。

  静态库:

 静态库的生成及使用:

 1、生成.o文件      gcc -c hello.c 

 2、制作静态库      ar rcsv libhello.a hello.o              ar:归档工具,将hello.o归档成静态库

 3、链接静态库      gcc -o hello_test hello_test.c -L. -lhello      -L dir:在库文件的搜索路径列表中添加dir目录;

                                        -lname: 指示编译时链接到库文件libname.a或者libname.so

 

 

 

 

 

  

  动态库:

动态库的生成及使用:

1、生成.o文件      gcc -fPIC -c hello.c                  -fPIC:创建位置无关目标代码

2、制作动态库      gcc -shared -o libhello.so hello.o          -share:生成动态文件

3、链接动态库      gcc -o hello_test hello_test.c -L. -lhello

 

 

 

 

 

  

  运行可执行程序之前,需要注册动态库的路径名,注册的几个方法:

1、修改/etc/ld.so.conf文件

2、修改LD_LIBRARY_PATH环境变量

3、将库文件直接复制到/lib或者/usr/lib目录下(这两个目录是系统的默认的库路径名)    列:cp libhello.so /lib

 

 

 

 

关于-fPIC的详细解释可以到这个博主的文章链接查看:

http://blog.sina.com.cn/s/blog_54f82cc201011op1.html#cmt_57E8BB9B-7F000001-5E601934-7D9-8A0 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!