一直对编译的过程概念很模糊,总结记录一下方便以后复习。
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
来源:https://www.cnblogs.com/ACqi/p/7760199.html