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
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
是不是应该这样写呢?
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
我的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下面,忘记说了。
编译暂时通过了。继续继续,大功告成就给分哈,别急!
在 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
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
是不是应该这样写呢?
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
我的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下面,忘记说了。
编译暂时通过了。继续继续,大功告成就给分哈,别急!
在 Solaris 下可能会 "relocations remain against allocatable but non-writable sections and relocation error",加上 -mimpure-text 和 -shared 一起用。
偶是在Solaris下面,忘记说了。
编译暂时通过了。继续继续,大功告成就给分哈,别急!