程序设计思路是,功能接口提供在.h文件中,源代码在.c文件中,应用程序通过包含头文件调用功能api。一个简易的模型如下:
有三个文件:src.h,src.c,main.c,src.h中提供接口声明,src.c中包含源代码实现,main.c是调用接口的模块,内容如下:
src.h:
#ifndef _SRC_H
#define _SRC_H
void print();
#endif
src.c:
#include <stdio.h>
void print()
{
printf("test\n");
}
main.c:
#include "src.h"
void main()
{
print();
}
任何大型项目都遵循这样的设计模型,有3种方法实现版本编译:将所有文件一起编译、使用静态链接库、使用动态链接库,项目管理中不会使用第一种方式。
1.将所有文件编译到一起
命令
gcc src.c main.c
得到可执行文件a.out,大小是6698字节,文件顺序无所谓,可以将main.c放在前面
2.使用静态链接库
首先产生src.o文件,即所谓的目标代码,命令如下:
gcc -c src.c
此命令只调用编译器和汇编器,不调用链接器,接下来使用命令:
ar rcs libsrc.a src.o
得到libsrc.a文件,这就是静态链接库,复制到/usr/lib64下,编译命令:
gcc main.c -static -lsrc
产生a.out,大小是762697,明显比第一种方式产生的文件大
3.使用动态链接库
产生libsrc.so文件命令如下:
gcc -shared -fPIC -c src.c
gcc -shared -fPIC -o libsrc.so src.o
将libsrc.so移动到/usr/lib64中,编译命令:
gcc main.c -lsrc
产生a.out,大小是6930字节。
使用ldd命令可以查看可执行文件中动态链接库关系,如下:
ldd a.out
linux-vdso.so.1 => (0x00007fff949ff000)
libsrc.so (0x00007fe6c6bde000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe6c6836000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe6c6de0000)
编译器有多个查找lib的路径,常用有如下几种:
/usr/lib
/usr/lib64
/lib
/lib64
/usr/local/lib
/usr/local/lib64
只要将so文件放入任何一个路径下即可,在多个路径下有同名so文件的情况下,编译器使用最新的so文件,一个例外是在/etc/ld.so.cache中指定链接。