当前位置: 技术问答>linux和unix
高分求救,linux下的动态链接库使用
来源: 互联网 发布时间:2016-05-31
本文导语: 我照着这个帖子学习动态链接库 http://www.moon-soft.com/download/info/2642.htm 到了要生成libmy.so这个动态链接库的时候,由于作者提供的是makefile,我测试它的makefile有错,报 makefile-lib:8: *** missing separator. Stop. 我makefile语法...
我照着这个帖子学习动态链接库
http://www.moon-soft.com/download/info/2642.htm
到了要生成libmy.so这个动态链接库的时候,由于作者提供的是makefile,我测试它的makefile有错,报
makefile-lib:8: *** missing separator. Stop.
我makefile语法不太熟悉,所以继续不下去.
于是自己用gcc -fpic -shared -o libmy.so getdate.c gettime.c 来生成了libmy.so 这个链接库.
这些.c跟.so以及 datetime.h 都在/root/dll_test_work文件夹里,然后我把libmy.so 拷贝到/lib文件夹下.
(我想问下,我自己执行的这条指令没有对datetime.h的依赖,生成的.so可用不?因为后面问题来了.)
我想使用这个动态链接库,就照着/* 文件名称: dy.c */ ,像作者说的那样,写完,然后编译,
同理,它是makefile,我是 gcc -rdynamic -s -o dy dy.c -ldl
这样编译,然后错误一堆,
dy.c: In function `main':
dy.c:10: `DATETYPE' undeclared (first use in this function)
dy.c:10: (Each undeclared identifier is reported only once
dy.c:10: for each function it appears in.)
dy.c:10: parse error before "d"
dy.c:11: `TIMETYPE' undeclared (first use in this function)
dy.c:25: `getdate' undeclared (first use in this function)
dy.c:34: `getdate' used prior to declaration
dy.c:34: `d' undeclared (first use in this function)
dy.c:37: `gettime' undeclared (first use in this function)
dy.c:46: `gettime' used prior to declaration
dy.c:46: `t' undeclared (first use in this function)
[root@localhost use_lib]# gcc -o dy -ldl dy.c
基本上就是无法调用,该链接库.求高手帮我搞定,或者让他那个makefile可以执行也可以.谢谢,搞定的话,分还可以加.
http://www.moon-soft.com/download/info/2642.htm
到了要生成libmy.so这个动态链接库的时候,由于作者提供的是makefile,我测试它的makefile有错,报
makefile-lib:8: *** missing separator. Stop.
我makefile语法不太熟悉,所以继续不下去.
于是自己用gcc -fpic -shared -o libmy.so getdate.c gettime.c 来生成了libmy.so 这个链接库.
这些.c跟.so以及 datetime.h 都在/root/dll_test_work文件夹里,然后我把libmy.so 拷贝到/lib文件夹下.
(我想问下,我自己执行的这条指令没有对datetime.h的依赖,生成的.so可用不?因为后面问题来了.)
我想使用这个动态链接库,就照着/* 文件名称: dy.c */ ,像作者说的那样,写完,然后编译,
同理,它是makefile,我是 gcc -rdynamic -s -o dy dy.c -ldl
这样编译,然后错误一堆,
dy.c: In function `main':
dy.c:10: `DATETYPE' undeclared (first use in this function)
dy.c:10: (Each undeclared identifier is reported only once
dy.c:10: for each function it appears in.)
dy.c:10: parse error before "d"
dy.c:11: `TIMETYPE' undeclared (first use in this function)
dy.c:25: `getdate' undeclared (first use in this function)
dy.c:34: `getdate' used prior to declaration
dy.c:34: `d' undeclared (first use in this function)
dy.c:37: `gettime' undeclared (first use in this function)
dy.c:46: `gettime' used prior to declaration
dy.c:46: `t' undeclared (first use in this function)
[root@localhost use_lib]# gcc -o dy -ldl dy.c
基本上就是无法调用,该链接库.求高手帮我搞定,或者让他那个makefile可以执行也可以.谢谢,搞定的话,分还可以加.
|
你知道吗?你这是在误入歧途...
我给你写个最简单的动态库生成及使用的例子吧,仅供你参考:
首先编译生成动态的库:
[root][~]# gcc -fPIC -O2 -c fun.c
[root][~]# gcc -shared -o libfun.so fun.o
然后编译测试代码:
[root][~]# gcc -O2 -c testfun.c
[root][~]# gcc -o testfun testfun.o -L=./ -lfun
下面第一次运行测试程序:
[root][~]# ./testfun
./testfun: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory
这个是后会提示错误,原因是找不到libfun.so这个库。因为系统的加载器在加载库的时候,只到特定的目录下去
搜索库,相关的内容,可以man ldconfig。我们的库在我们当前的目录下,并不在系统lib目录下,所以搜索不
到。解决的方法有两种:
1、把我们的目录添加到库PATH里面去
2、把我们的库直接cp到系统PATH里面去
我采用第二种方法:
[root][~]# cp libfun.so /lib/
然后再运行一下测试程序:
[root][~]# ./testfun
Call libfun.so
In libfun.so
Call libfun.so done
我给你写个最简单的动态库生成及使用的例子吧,仅供你参考:
//这个是库的代码
#include
void fun()
{
printf("In libfun.son");
}
//下面是测试代码
#include
int main()
{
printf("Call libfun.son");
fun();
printf("Call libfun.so donen");
return 0;
}
首先编译生成动态的库:
[root][~]# gcc -fPIC -O2 -c fun.c
[root][~]# gcc -shared -o libfun.so fun.o
然后编译测试代码:
[root][~]# gcc -O2 -c testfun.c
[root][~]# gcc -o testfun testfun.o -L=./ -lfun
下面第一次运行测试程序:
[root][~]# ./testfun
./testfun: error while loading shared libraries: libfun.so: cannot open shared object file: No such file or directory
这个是后会提示错误,原因是找不到libfun.so这个库。因为系统的加载器在加载库的时候,只到特定的目录下去
搜索库,相关的内容,可以man ldconfig。我们的库在我们当前的目录下,并不在系统lib目录下,所以搜索不
到。解决的方法有两种:
1、把我们的目录添加到库PATH里面去
2、把我们的库直接cp到系统PATH里面去
我采用第二种方法:
[root][~]# cp libfun.so /lib/
然后再运行一下测试程序:
[root][~]# ./testfun
Call libfun.so
In libfun.so
Call libfun.so done
|
你的动态库不是 libmy.so 吗? 貌似应该:
gcc -o dy dy.c -lmy
|
# makefile-lib : 纵横软件制作中心雨亦奇编写, 2001-06-28.
all : my.so
SRC = getdate.c gettime.c
TGT = $(SRC:.c=.o)
$(SRC) : datetime.h
@touch $@
%.o : %.c
cc -c $?
# 动态函数库(my.so)生成
my.so : $(TGT)
cc -shared -o $@ $(TGT)
Makefile 的错误应该是往网页上粘贴的时候, TAB 符号被修改了
需要执行命令的前面必须是一个 TAB 符号
lz 的编译错误应该是没有包含对应的头文件
|
学习了,晚上自己测试一下,最近正准备使用动态链接库呢
以前我用的都是编译成动态链接库.so,但是应用程序编译后,使用的静态编译,直接联编.so库文件的
不知道现在大家说的这种方式是有啥区别,测试下先
另外,我感觉,如果真的是使用.so的动态链接库模式,理论上应该是
dlopen、然后dlsym定位找到对应的函数位置,然后调用的方式
晚上测试一下fetag 兄的那种方式,好像那样的话,单独更新了.so后,尤其是.so变化很大的情况下,不知是否还需要重新联编可执行程序的?