Linux 相关编译知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 相关编译知识相关的知识,希望对你有一定的参考价值。

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

  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 

以上是关于Linux 相关编译知识的主要内容,如果未能解决你的问题,请参考以下文章

Vim编译器的相关知识

Linux 相关基础知识认知1

linux下ffmpeg库 ARM交叉编译

Linux巩固记录 java项目的编译和执行

Linux学习日记——源码编译Apache

Linux的编译知识