编译三个.c文件:
gcc initapi.c randapi.c test.o -o test 编译成可执行映像
编译成库的形式:
gcc -c -Wall initapi.c (-c 表示只编译不链接,-Wall打开全部警告设置)
gcc -c -Wall randapi.c
ar -cru libmyrand.a initapi.o randapi.o (产生一个库,c指明构建静态库,r替换库中已经存在的目标,u安全选项,更新替换)
使用这个库:
gcc test.c -L. -lmyrand -o test (L.告诉gcc库可在当前目录下找到 -l选项指定了要使用的库)
ar 的t选项可以用来查看静态库中包含的内容,d移除,x提取,v显示详细
要生成地址无关的源文件,使用PIC选项:
gcc -fPIC -c initapi.c
gcc -fPIC -c randapi.c
使用-shared标志在此基础上创建一个共享库:
gcc -shared initapi.o randapi.o -o libmyrand.so (share object)
使用这个库:
gcc test.c -L. -lmyrand -o test
ldd命令查看test映像依赖于哪些共享库。
还有一种动态加载库,它在运行时加载,而不像共享库那样在程序启动时加载。(DLL)
主要使用一些加载函数:dlopen打开库,dlerror,dlsym获得函数句柄,dlclose
Makefile文件示例:
VPATH= lib app //指定了make依据生成规则查找源文件的路径
LIBSRC= lib.c bar.c
//源文件和目标文件列表,供生成规则使用
LIBOBJ= $(LIBSRC:.c=.o)
APPSRC= main.c app.c
APPOBJ= $(APPSRC:.c=.o)
//一些编译器标志
CFLAGS=
INCLUDES= -I ./lib
//默认生成目标,生成库和程序
all: libexp.a appex
//将源文件转化为目标文件的规则
%.o:%.c
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $<
//如何构建库
libexp.a: $(LIBOBJ)
$(AR) cru libexp.a $(LIBOBJ)
//如果构建程序
appex: $(APPOBJ) libexp.a
$(CC) -o appex $(APPOBJ) -lexp -L.
其他的如清除目标、所包含头文件的依赖跟踪、安装生成二进制码的方法等,构成一个完整的Makefile。
可以使用自动工具来构建。