Linux学习:02-生成动态库和静态库

2020-06-23  本文已影响0人  放纵的卡尔

linux中制作动静态库

add.c mul.c main.c 文件如下:
tinychan@ubuntu:~/Desktop/gcc$ cat add.c  mul.c main.c
//
// Created by tinychan on 4/25/20.
//
int add(int a,int b){
    return a+b;

}



//
// Created by tinychan on 4/25/20.
//
int mul(int a,int b){
    return a*b;

}


#include <stdio.h>
#include "add.h"
#include "mul.h"
int main() {

    int sum=add(1,2);
    int result=mul(2,3);
    printf("HelloWorld! %d ,%d\n",sum,result);
#ifdef DE_DEBUG
    printf("DET_DEBUG\n");
#endif

    return 0;
}

制作静态库:

1.生成.o文件

gcc -c *.c -I ./include/

2.生成静态库

ar rcs libmath.a *.o

3.使用静态库

gcc main.c -I ./include/ -L ./ -lmath

制作动态库

1.生成与位置无关的.o 文件

gcc -fPIC -c

2.生成so文件

3.使用so

tinychan@ubuntu:~/Desktop/gcc$ gcc -fPIC -c *.c -I ./include/
tinychan@ubuntu:~/Desktop/gcc$ gcc -shared -o libmath.so -I ./include/ *.o
tinychan@ubuntu:~/Desktop/gcc$ gcc main.c -o app -I ./include/ -L ./ -lmath 
tinychan@ubuntu:~/Desktop/gcc$ ./app
./app: error while loading shared libraries: libmath.so: cannot open shared object file: No such file or directory
tinychan@ubuntu:~/Desktop/gcc$ pwd
/home/tinychan/Desktop/gcc
tinychan@ubuntu:~/Desktop/gcc$ gcc main.c -o app.out -I ./include/ -L ./ -lmath -Wl,-rpath /home/tinychan/Desktop/gcc
tinychan@ubuntu:~/Desktop/gcc$ ls
add.c  add.o  app  app.out  include  lib  libmath.so  main.c  main.o  mul.c  mul.o
tinychan@ubuntu:~/Desktop/gcc$ ./app.out
HelloWorld! 3 ,6

说明: cannot open shared object file: No such file or directory . linux默认lib\user下的库文件中需找so,需要配置动态库的路径,可以使用-Wl,-rpath 或者设置环境变量.

环境变量配置法如下(但是建议使用-Wl,-rpath)
指定方法:

    1. 环境变量法:export LD_LIBRARY_PATH=./ 将当前目录加入环境变量,但是终端退出了就无效了。

    2. 配置文件法:将上条写入家目录下.bashrc文件中    (永久生效,设置到~/.bashrc)

    3. 拷贝法:直接将libmymath.so文件拷贝到/usr/lib/目录下。(受libc库的启发)

    4. 缓存文件法:将libmymath.so所在绝对路径加入到/etc/ld.so.conf文件,

       使用sudo ldconfig -v 动态更新/etc/ld.so.cache文件(2进制文件)
上一篇 下一篇

猜你喜欢

热点阅读