test.c

test.h

main.c

gcc -o test.o -c test.c
/*静态库必须以 lib 为前缀,文件拓展名为 .a*/
ar -rsv libtest.a test.o
/*
-L 表示添加库的搜索路径,. 代表当前目录
-l 注意是小写的L,代表库的名称
静态库的真正名称 = libhello.a 去掉前缀 lib 和 后缀 .a
*/
gcc main.c -o main -L. -ltest

/*如果 test.c 用到了其他 .c文件,比如add.c、sub.c,相关文件也需要生成目标文件。*/
gcc -fPIC -o test.o -c test.c
这里新增了 -fPIC 选项,实际上改变的是 hello.o 的符号表,我们可以使用 nm 命令查看hello.o的符号表,多出了一个全局偏移表,没有这个偏移表是无法动态编译的。
/*gcc -shared -o libxxx.so xxx.o xxx.o ... */
gcc -shared -o libtest.so test.o
export LD_LIBRARY_PATH=./
- 只是在当前 Shell 环境下有效,如果新开一个终端,相当于创建了一个新的Shell环境,该环境下的环境变量LD_LIBRARY_PATH是空的。
- 环境变量 LD_LIBRARY_PATH是动态库的搜索路径,一般情况下为空,可执行文件运行时,会去这个环境变量中搜索动态库路径
/*与静态库使用时的编译命令一致*/
gcc main.c -o main -L. -ltest
ldd 命令可以查看当前执行文件所链接的动态库
