Centos7系统
一. 静态库
- 名称 : libxxxx.a, xxxx是该lib的名称
- 特点 : 编译过程中已经被载入可执行程序, 因此体积较大
- Makefile :
#Makefile CC := gcc AR := ar all: $(CC) -c lpm.c -o lpm.o -Wall -Werror $(AR) cr liblpm.a lpm.o #-L 指定库的路径 -l 指定需连接的库名 #-Wl,-Bstatic指示跟在后面的-lxxx选项链接的都是静态库 #-Wl,-Bdynamic指示跟在后面的-lxxx选项链接的都是动态库 $(CC) main.c -o main -L. -Wl,-Bstatic -llpm -Wl,-Bdynamic -Wall -Werror clean: rm main *.o *.a
二. 动态库(共享库)
- 名称 : libxxxx.so.major.minor, xxxx是该lib的名称, major是主版本号, minor是副版本号
- 特点 : 可执行程序运行时才载入内存的, 在编译过程中仅简单的引用, 因此代码体积较小
- 动态库路径设置 :
(1) 把库拷贝到/usr/libxxxx目录下
(2) 在LD_LIBRARY_PATH环境变量中加上库所在路径. 例如,
(3) 修改/etc/ld.so.conf文件, 把库所在的路径加到文件末尾, 并执行ldconfig刷新export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/demo/liblpm.so
- Makefile :
#Makefile CC := gcc all: $(CC) -fPIC -shared lpm.c -o liblpm.so -Wall -Werror #-L 指定库的路径 -l 指定需连接的库名 #-Wl,-Bstatic指示跟在后面的-lxxx选项链接的都是静态库 #-Wl,-Bdynamic指示跟在后面的-lxxx选项链接的都是动态库 $(CC) main.c -o main -L. -Wl,-Bdynamic -llpm -Wall -Werror clean: rm main *.o *.so
三. tip
- 当静态库和动态库同名时, gcc命令将优先使用动态库
- nm命令 : 打印出库中的涉及到的所有符号
- ldd命令 : 查看一个可执行程序依赖的共享库
- strip命令 : 精简可执行程序, 以及库(删除相关符号信息和调试信息)
#include "lpm.h"
int main(int argc, char **argv){
lpm_print("hello world!");
return 0;
}
#ifndef LPM_H
#define LPM_H
void lpm_print(const char *str);
#endif //LPM_H
#include <stdio.h>
void lpm_print(const char *str){
if(str != NULL)
printf("LPM %s\n", str);
else
printf("str is Null!");
}