当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 关于wiki--C编译初步中的创建共享库的问题
帖子发表于 : 2008-12-24 10:00 

注册: 2008-12-22 19:40
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
------------------------引用--------------------------
创建共享库

共享库是编译器以一种特殊的方式生成的对象文件的集合。对象文件模块中所有地址(变量引用或函数调用)都是相对而不是绝对的,这使得共享模块可以在程序的运行过程中被动态地调用和执行。
要构建一个共享库,首先要编译出库中需要的对象模块。例如:下面是文件名为 shellofirst.c 和 shellosecond.c 的两个源码文件:

/* shellofirst.c */
#include <stdio.h>
void shellofirst()
{
printf(“The first hello from a shared library\n”);
}
/* shellosecond.c */
#include <stdio.h>
void shellosecond()
{
printf(“The second hello from a shared library\n”);
}

要将以上两个源码文件编译成对象文件,可以用下面的命令:

$ gcc -c -Wall -fpic shellofirst.c shellosecond.c

选项 -c 告诉编译器只生成 .o 的对象文件。选项 -fpic 使生成的对象模块采用浮动的(可重定位的)地址。缩微词 pic 代表“位置无关代码”(position independent code)。

下面的 gcc 命令将对象文件构建成一个名为 hello.so 的共享库:

$ gcc -Wall -shared shellofirst.o shellosecond.o -o hello.so

选项 -o 用来为输出文件命名,而文件後缀名 .so 告诉编译器将对象文件链接成一个共享库。通常情况下,链接器定位并使用 main() 函数作为程序的入口,但是本例中输出模块中没有这种入口点,为抑制错误选项 -shared 是必须的。

编译器能将後缀为 .c 的文件识别为 C 语言源代码文件,并知道如何将其编译成为对象文件。基于这一点,先前的两条命令我们可以合并为一条;下面的命令直接将模块编译并存储为共享库:

$ gcc -Wall -fpic -shared shellofirst.c shellosecond.c -o hello.so

下面的程序,存储在文件 stwohellos.c 内,是调用共享库中两个函数的主程序:

/* stwohellos.c */
void shellofirst(void);
void shellosecond(void);
int main(int argc,char *argv[])
{
shellofirst();
shellosecond();
return 0;
}

该程序可以用下面的命令编译并链接共享库:

$ gcc -Wall stwohellos.c hello.so -o stwohellos

程序 stwohello 已经完成,但要运行它必须让其能定位到共享库 hello.so,因为库中的函数要在程序运行时被加载。
-----------------引用结束----------------------------
问题:
$ gcc -Wall stwohellos.c hello.so -o stwohellos成功后,执行./stwohellos
出现:
./stwohellos: error while loading shared libraries: hello.so: cannot open shared object file: No such file or directory

“程序 stwohello 已经完成,但要运行它必须让其能定位到共享库 hello.so”,这个定位是什么意思?
我的hello.so和stwohellos都在~/test下。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 关于wiki--C编译初步中的创建共享库的问题
帖子发表于 : 2008-12-24 21:03 

注册: 2006-03-10 15:10
帖子: 3182
地址: xi'an China
送出感谢: 0 次
接收感谢: 2
引用:
问题:
$ gcc -Wall stwohellos.c hello.so -o stwohellos成功后,执行./stwohellos
出现:
./stwohellos: error while loading shared libraries: hello.so: cannot open shared object file: No such file or directory

“程序 stwohello 已经完成,但要运行它必须让其能定位到共享库 hello.so”,这个定位是什么意思?
我的hello.so和stwohellos都在~/test下。


当程序 stwohellos 将要运行时,它会搜索它需要的共享库 hello.so

首先,它检查环境变量LD_LIBRARY_PATH ,这是一个以逗号分割的目录的列表(一般该变量为空)。将尝试在这些目录中寻找 hello.so 这个共享库。
对于本例的情况,在执行./stwohellos之前先执行
代码:
export LD_LIBRARY_PATH=. 
程序即可正常运行。


其次,如果在上面的目录中没找到所需要的库。将会检查文件 /etc/ld.so.cache ,它是一个可用的库的列表,使用 ldconfig 来维护这个文件。

在本例中, 将hello.so 所在的目录添加到 /etc/ld.so.conf文件中,然后执行
代码:
sudo ldconfig
即可更新 /etc/ld.so.cache 文件,随后 ./stwohellos 即可正常运行

再次,如果 LD_LIBRARY_PATH 没指定库目录,/etc/ld.so.cache 中也没找到所需库的名字。将会在 /lib 和 /usr/lib 目录中寻找 hello.so

在本例中,可以直接将 hello.so 复制到 /lib 或者 /usr/lib 目录下,然后程序也可正常运行。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 关于wiki--C编译初步中的创建共享库的问题
帖子发表于 : 2008-12-25 14:18 

注册: 2008-12-22 19:40
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
第一种和第三种方法都好用。
第二种“将hello.so 所在的目录添加到 /etc/ld.so.conf文件中”
我的/etc/ld.so.conf中只有:include /etc/ld.so.conf.d/*.conf
于是我在下面加了一条语句:include /home/lixue/test 然后sudo ldconfig
好像没用。。。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 关于wiki--C编译初步中的创建共享库的问题
帖子发表于 : 2008-12-25 20:30 

注册: 2006-03-10 15:10
帖子: 3182
地址: xi'an China
送出感谢: 0 次
接收感谢: 2
引用:
第二种“将hello.so 所在的目录添加到 /etc/ld.so.conf文件中”
我的/etc/ld.so.conf中只有:include /etc/ld.so.conf.d/*.conf
于是我在下面加了一条语句:include /home/lixue/test 然后sudo ldconfig
好像没用。。。



哦,这儿有两个问题。

1. 按惯例,一般不论共享库还是静态库,都以lib这三个字符作为文件名的开头。ldconfig 也只检索目录中的以lib开头的动态库文件。
在本例中 hello.so 就被 ldconfig 忽略了。更正的方式就是以后生成共享库时命名成 lib*.so 这种格式的。

2. 将目录添加到 /etc/ld.so.conf 中时,直接添加即可,前面不要加 include
或者是 在 /etc/ld.so.conf.d/ 目录中新建一个以 .conf 结尾的文件,将你的目录直接添加到该文件中(这也是目前通常的做法)


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 关于wiki--C编译初步中的创建共享库的问题
帖子发表于 : 2008-12-25 21:11 

注册: 2008-12-22 19:40
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
我试过了,这样果然就好用了,哈哈,太感谢了 :em02 :em63


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译