当前位置: 技术问答>linux和unix
请教:多个文件如何生成动态链接库(.so)?
来源: 互联网 发布时间:2016-02-06
本文导语: 以前只是在程序中用一些现成的库,现在要把自己的多个文件封装成一个动态链接库,在网上找个找资料,基本都是说用如下命令: gcc -fPIC -shared -o libNAME.so file1.c file2.c 这些例子想对比较简单; 我现在要解决的...
以前只是在程序中用一些现成的库,现在要把自己的多个文件封装成一个动态链接库,在网上找个找资料,基本都是说用如下命令:
gcc -fPIC -shared -o libNAME.so file1.c file2.c
这些例子想对比较简单;
我现在要解决的问题是,我的程序对外只提供一个函数接口,但是呢,这个函数却需要调用很多我自己写的文件里面的函数。就是我程序中有很多源文件和头文件,我的Makefile是这样的:
test : subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o
gcc -o test subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o -lm -lxml2
test.o : test.c
gcc -I /usr/include/libxml2 -c -g test.c
detect.o : detect.c detect.h
gcc -I /usr/include/libxml2 -c -g detect.c
UpdateRule.o : UpdateRule.c UpdateRule.h
gcc -I /usr/include/libxml2 -c -g UpdateRule.c
Tree.o: Tree.c Tree.h
gcc -c -g Tree.c
TraitList.o: TraitList.c TraitList.h
gcc -c -g TraitList.c
distance.o : distance.c distance.h
gcc -c -g distance.c
MatchKey.o : MatchKey.c MatchKey.h
gcc -c -g MatchKey.c
bm.o : bm.c bm.h
gcc -c -g bm.c
ParseXml.o: ParseXml.c ParseXml.h
gcc -I /usr/include/libxml2 -c -g ParseXml.c
NodeList.o : NodeList.c NodeList.h
gcc -c -g NodeList.c
subNodeList.o : subNodeList.c subNodeList.h
gcc -c -g subNodeList.c
clean :
rm -rf *.o test
其中,detect.c中包括对外使用的函数接口,test.c里面就是一个main函数,调用这个函数接口,测试用的。
比如subNodeList.c,NodeList.c Tree.c 等都是我函数中用到的数据结构,而且其中还用到了其他的库。
我感觉文件依赖关系多,而且还调用了其他的库,不知该如何生成库,希望大家指点一下。谢谢!
gcc -fPIC -shared -o libNAME.so file1.c file2.c
这些例子想对比较简单;
我现在要解决的问题是,我的程序对外只提供一个函数接口,但是呢,这个函数却需要调用很多我自己写的文件里面的函数。就是我程序中有很多源文件和头文件,我的Makefile是这样的:
test : subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o
gcc -o test subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o -lm -lxml2
test.o : test.c
gcc -I /usr/include/libxml2 -c -g test.c
detect.o : detect.c detect.h
gcc -I /usr/include/libxml2 -c -g detect.c
UpdateRule.o : UpdateRule.c UpdateRule.h
gcc -I /usr/include/libxml2 -c -g UpdateRule.c
Tree.o: Tree.c Tree.h
gcc -c -g Tree.c
TraitList.o: TraitList.c TraitList.h
gcc -c -g TraitList.c
distance.o : distance.c distance.h
gcc -c -g distance.c
MatchKey.o : MatchKey.c MatchKey.h
gcc -c -g MatchKey.c
bm.o : bm.c bm.h
gcc -c -g bm.c
ParseXml.o: ParseXml.c ParseXml.h
gcc -I /usr/include/libxml2 -c -g ParseXml.c
NodeList.o : NodeList.c NodeList.h
gcc -c -g NodeList.c
subNodeList.o : subNodeList.c subNodeList.h
gcc -c -g subNodeList.c
clean :
rm -rf *.o test
其中,detect.c中包括对外使用的函数接口,test.c里面就是一个main函数,调用这个函数接口,测试用的。
比如subNodeList.c,NodeList.c Tree.c 等都是我函数中用到的数据结构,而且其中还用到了其他的库。
我感觉文件依赖关系多,而且还调用了其他的库,不知该如何生成库,希望大家指点一下。谢谢!
|
在gcc -o里加上 -shared -Wl,-soname,libtest.so就可以了,其他不用改
gcc -shared -Wl,-soname,libtest.so -o libtest.so subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o -lm -lxml2
gcc -shared -Wl,-soname,libtest.so -o libtest.so subNodeList.o NodeList.o ParseXml.o bm.o distance.o MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o test.o -lm -lxml2