CubieBoard博客-HomeCubieTech公司网站

cubie.cc CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 3314|回复: 0

GCC编译使用动态链接库和静态链接库

[复制链接]

113

主题

1

好友

1万

积分

版主

Rank: 7Rank: 7Rank: 7

贡献
2467
金钱
5721
威望
2467
买家信用
卖家信用
积分
13584
发表于 2014-9-25 11:05:10 |显示全部楼层
库的分类:

静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。

有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。

动态链接库sample:

1. 创建动态链接库

[cpp]

    #include<stdio.h>  

    void hello()  

    {  

            printf("hello world/n");  

    }  



用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。



2. 再编辑一个测试文件test.c,内容如下

[cpp]

    #include<stdio.h>  

    int main()  

    {  

            printf("call hello()");  

            hello();  

    }  



编译 gcc test.c -lhello

-l 选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.



但这样还不行,编译会出错。

In function `main':



test.c.text+0x1d): undefined reference to `hello'

collect2: ld returned 1 exit status



这是因为hello这个库在我们自己的路径中,编译器找不到。

需要使用-L选项,告诉hello库的位置



gcc test.c -lhello -L. -o test



-L .告诉编译器在当前目录中查找库文件





3. 编译成功后执行./test, 仍然出错

说找不到库



有两种方法:

一、可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。

二、把当前路径加入环境变量LD_LIBRARY_PATH中



当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。





我们采用第二种方法:



export LD_LIBRARY_PATH=.LD_LIBRARY_PATH



这样,再执行就成功了。LD_LIBRARY_PATH是一个临时设置到变量,在下一次开机到时候就不会存在。

下面再讲讲静态链接库

仍使用刚才的hello.c和test.c。



1. gcc -c hello.c -o hello.o注意这里没有使用-shared选项

2. 把目标文件归档    ar -r libhello.a hello.o





    程序 ar 配合参数 -r 创建一个新库 libhello.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

3. 在程序中链接静态库

           gcc test.c -lhello -L. -static -o hello.static





或者   gcc test.c libhello.a -L. -o hello.static



生成的hello.static就不再依赖libhello.a了



我 自己到理解:说白了,假如一个程序里面包含来另外一个文件,然后先将另外一个文件引进来调用。这个被引进来到程序,如果被制作成了动态链接库到话,则需要 在核心程序调用其到时候,制定出库源文件到路径,将其动态到调入进来使用。但是,静态到则是,在编译进去到时候已经将全部程序调用进来了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|邮件群发|cubie.cc---深刻的嵌入式技术和应用讨论中文社区 ( 粤ICP备13051116号-1  

GMT+8, 2019-10-24 00:33 , Processed in 0.020493 second(s), 7 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc. | Style by Coxxs

回顶部