Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • 动态库和静态库

    post by onelong / 2011-11-27 21:33 Sunday [C语言学习]

    昨天看了一天博文,终于对动态库和静态库有所理解啦,静态可以编译时会加入目标程序的。而动态库呢?运行时加载的!至于具体怎样操作呢?看下面你可以很详细的了解动态库和静态库。

    动态库调用静态库

    http://hi.baidu.com/proinsight/blog/item/f8d260f388368dc30b46e086.html

    Linux下动态库的创建和加载

    http://wenku.baidu.com/view/562b4d00bed5b9f3f90f1c34.html

    PIC以及动态链接、动态加载

    http://icoder.cloudcontrolled.com/index.php/2011/03/06/pic-and-dynamic-linking-loading/

    Linux 动态库剖析

    http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/

    编译静态库是使用ar而不是gcc的,我们不能直接把静态的库编译到so里,像编译库一样。如果真的是这样做了,在编译称可执行的代码时会找不到函数的。

    下面搞个例子吧:

    //add.c

     

    int add(int a, int b){

    return a+b;

    }

    //sub.c

     

    int sub(int a, int b)

    {

    return a - b;

    }

    //main.c

    int main(){

    int a = 2,b = 1;

    add(a, b);

    sub(a, b);

    return 0;

    }

    看看makefile

     

    main:pp.so main.c

    gcc -o main -Wl,-rpath,. main.c -L. -lpp

    pp.so:test.a

    gcc -shared -fPIC -o libpp.so -Wl,-rpath,. -L. -ltest

    test.a:add.o sub.o

    ar -r libtest.a sub.o add.o

    sub.o:sub.c

    gcc -o sub.o -fPIC -c sub.c

    add.o:add.c

    gcc -o add.o -fPIC -c add.c

    make的时候报错了

     

    gcc -o add.o -fPIC -c add.c

    gcc -o sub.o -fPIC -c sub.c

    ar -r libtest.a sub.o add.o

    ar: creating libtest.a

    gcc -shared -fPIC -o libpp.so -Wl,-rpath,. -L. -ltest

    gcc -o main -Wl,-rpath,. main.c -L. -lpp

    /tmp/ccVY9TLk.o: In function `main':

    main.c:(.text+0x26): undefined reference to `add'

    main.c:(.text+0x3a): undefined reference to `sub'

    collect2: ld 返回 1

    make: *** [main] 错误 1

    又是找不到函数,我郁闷了一个早上。后来看了别人的文章,修改一下可以了。
    为什么会这样的呢?看下面的.....

    pp.so:test.a

    gcc -shared -fPIC -o libpp.so -Wl,-rpath,. -L. -ltest

    估计是没有人这样编译库的吧。静态的库必须和他的调用程序一起编译成目标的程序如动态库。这就是我花一一天事情去弄明白的事情啦。

    标签: linux ubuntu C语言 c
    引用地址:
     

    我要评论