Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830508
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: 系统运维

2011-11-26 10:10:40

实验如下:

同时编写三个源码文件

hello.c
#include
#include
#include

int main ( void )
{
hello1();
hello2();
return 0;
}
hello1.c
#include
#include

void hello1()
{
printf(\"hello , i am hello1\n");
return;
}
hello2.c
#include
#include

void hello2()
{
printf(\"hello , i am hello2\n");
return;
}
先将 hello1.c 和 hello2.c 编译成动态链接库 libhello.so
cc -dy -K PIC -G -o libhello.so hello1.c hello2.c

再将 hello1.c 和 hello2.c 编译成静态链接库 libhello.a
cc -O -c hello1.c
cc -O -c hello2.c
ar -rv libhello.a hello1.o hello2.o

下面是关键的一步。

我们首先看看:

cc -o hello hello.o -L. -lhello

编译会生成一个 hello 的可执行文件,我们执行一下看看,咦,咋提示找不到动态链接库 libhello.so ?

进行如下操作:

LD_LIBRARY_PATH=${LIBRARY_PATH}:/usr/work/src/test/
export LD_LIBRARY_PATH

再执行一下看看? ./hello

OK , 程序顺利的打出两行。

由此可见,前面的编译操作链接的是动态链接库 libhello.so

我们再来执行编译操作
cc -dn -o hello hello.o -L. -lhello
编译同样会生成一个 hello 的可执行文件。

清除 LD_LIBRARY_PATH 环境变量
unset LD_LIBRARY_PATH

set 一下看看,我们发现环境变量 LD_LIBRARY_PATH 已经被清除了。

再次执行一下看看 ./hello
程序顺利打出两行信息。

总结:
在默认情况下,cc 编译成可执行文件的时候,如果在 -L 指向的路径下同时存在动态链接库和静态链接库,系统默认链接的是动态链接库。
cc -o hello hello.o -L. -lhello 相当于是 cc -dy -o hello hello.o -L. -lhello

如果强制编译器链接静态库,应使用 -dn 的参数
cc -dn -o hello hello.o -L. -lhello

如果使用的是 gcc 编译器,对应的参数是
-shared 和 -static

阅读(2146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~