美文网首页
Linux学习:02-生成动态库和静态库

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

作者: 放纵的卡尔 | 来源:发表于2020-06-23 23:43 被阅读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进制文件)

    相关文章

      网友评论

          本文标题:Linux学习:02-生成动态库和静态库

          本文链接:https://www.haomeiwen.com/subject/mtflfktx.html