请教:多个文件如何生成动态链接库(.so)?

时间:2022-06-01 22:10:54
以前只是在程序中用一些现成的库,现在要把自己的多个文件封装成一个动态链接库,在网上找个找资料,基本都是说用如下命令:
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 等都是我函数中用到的数据结构,而且其中还用到了其他的库。

我感觉文件依赖关系多,而且还调用了其他的库,不知该如何生成库,希望大家指点一下。谢谢!

5 个解决方案

#1


在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

#2


那个test.c源文件,就是一个main函数,我不想把它也编译到库里面去。

是不是应该这样写呢?

gcc  -shared -Wl,-soname,libdetect.so -o libdetect.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

#3


test.o没用就删喽,需要什么.o就加在后面就可以了

#4


嗯,我按你说的做了一下,出错了,麻烦看看可能是什么问题啊?

我的Makefile里面改的部分如下:

libdetect.so : subNodeList.o NodeList.o ParseXml.o bm.o distance.o   MatchKey.o TraitList.o Tree.o      UpdateRule.o detect.o
    gcc -fPIC -shared -Wl -soname,libdetect.o  -o libdetect.o  subNodeList.o NodeList.o ParseXml.o bm.o distance.o   MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o  -lm  -lxml2


ld: fatal: relocations remain against allocatable but non-writable sections
collect2: ld returned 1 exit status
make: *** [libdetect.so] Error 1

#5


呵呵,问题解决了,

在 Solaris 下可能会 "relocations remain against allocatable but non-writable sections and relocation error",加上 -mimpure-text 和 -shared 一起用。 

偶是在Solaris下面,忘记说了。

编译暂时通过了。继续继续,大功告成就给分哈,别急!

#1


在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

#2


那个test.c源文件,就是一个main函数,我不想把它也编译到库里面去。

是不是应该这样写呢?

gcc  -shared -Wl,-soname,libdetect.so -o libdetect.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

#3


test.o没用就删喽,需要什么.o就加在后面就可以了

#4


嗯,我按你说的做了一下,出错了,麻烦看看可能是什么问题啊?

我的Makefile里面改的部分如下:

libdetect.so : subNodeList.o NodeList.o ParseXml.o bm.o distance.o   MatchKey.o TraitList.o Tree.o      UpdateRule.o detect.o
    gcc -fPIC -shared -Wl -soname,libdetect.o  -o libdetect.o  subNodeList.o NodeList.o ParseXml.o bm.o distance.o   MatchKey.o TraitList.o Tree.o UpdateRule.o detect.o  -lm  -lxml2


ld: fatal: relocations remain against allocatable but non-writable sections
collect2: ld returned 1 exit status
make: *** [libdetect.so] Error 1

#5


呵呵,问题解决了,

在 Solaris 下可能会 "relocations remain against allocatable but non-writable sections and relocation error",加上 -mimpure-text 和 -shared 一起用。 

偶是在Solaris下面,忘记说了。

编译暂时通过了。继续继续,大功告成就给分哈,别急!