制作静态库
-
准备
.o
文件gcc -c .c .o
文件名和函数名一致 -
ar rcs libname.a file1.o file2.o …
静态库名字以lib开头,以.a结尾 -
gcc test.c libmymath.a -o test
此时由于隐式声明会出现警告但无伤大雅(二饼脸) -
关于隐式声明可以将库中的函数声明写在文件里但是过于繁琐,因此使用头文件方式加载静态库
-
将静态库和头文件分别放到其它目录下,头文件放在inc目录下, 库放在lib目录下
-
执行
gcc test.c ./lib/libmymath.a -o test -I ./inc
(-I指明头文件目录路径)
制作动态库
动态库里的函数用@plt标识,当动态库加载到内存时,再用加载进去的地址将@plt替换掉。
1. 生成与位置无关的.o文件
gcc -c add.c -o add.o -fPIC
使用该参数,生成的函数和位置无关,等待动态绑定。
2. 使用 gcc -shard
制作动态库
gcc -shared -o lib库名.so add.o sub.o div.o
3. 编译可执行程序时指定所使用的动态库。-l:指定库名-L:指定库路径
gcc test.c -o a.out -l mymath -L ./lib
4. 运行可执行程序./a.out
会出现错误
出错原因分析:
连接器:工作在链接阶段,工作时需要-l -L
动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置,指定动态库路径并使其生效,然后再执行文件。
通过指定环境变量指定动态库所在位置:export LD_LIBRARY_PATH=./lib
,暂时的,重启终端失效,因为环境变量是进程的概念,关闭终端之后再打开,是两个进程,环境变量发生了变化。要想永久生效,需要修改配置文件vim ~./bashrc
,文件生效. .bashrc
或者source .bashrc
或者重开终端让其自己加载
方法1:export LD_LIBRARY_PATH=./lib
方法2:vim ~./bashrc
,. .bashrc
或者source .bashrc
或者重开终端
方法3:拷贝自定义库到/lib
(标准C库所在位置)
方法4:配置文件法
sudo vim /etc/ld.so.conf
, 写入动态库绝对路径,sudo ldconfig -v
使配置文件生效。