怎样编写和编译动态库

我想写点简单的有动态库的程序,但不知道如何下手,请各位高手指点(提供相关的学习资料,链接也可,或可以直接贴一个完整的源程序):
关于头文件有什么要求?
在主程序、库文件中要添加写什信息?
Makefile 文件要怎样写?
各文件的路径的安排?……
先谢了!

呵呵 ,我正在编译一个动态库,直接贴出来把:)

[root@localhost hainan]# gcc -shared -fPIC -o libjcmpp.so JCMPP.c libtssx_cmpp.a -I. -I/opt/jdk142/include/ -I/opt/jdk142/include/linux

我这是把编译,连接一步完成了,
-fPIC 编译成位置无关代码,必须 不然你的程序在别的地方肯可能运行不了
-shared 当然是说要编译成共享库了
-I/opt/jdk142/include/ -I/opt/jdk142/include/linux 这些都是指明包含文件的路径

写一个测试程序,把.so对应的头文件包含进去就可以直接引用它的函数了
为了让系统知道你的库在哪里:

export LD_LIBRARY_PATH='pwd':$LIBRRARY_PATH_PATH

gcc test.c -o test -L. -lsoname

-L.指明在当前目录下找库文件,当然也可以是别的地方
-l是库的名字,注意,如果是libtest.so, 就写-ltest,lib是标准前缀,系统会自动添加,必要花蛇添足:)

已经比较清楚了,具体的更多的编译选项可以多去查些资料,<

  1<gnu linux编程指南="">&gt;中都有说明.   
  2\---------------------------------------------------------------   
  3  
  41、头文件中声明需要被调用的函数,类声明,需要导出的变量,没有特别的要求   
  52、编译连接时使用-shared选项,扩展名使用so就可以了   
  63、使用分为显式装入和隐式装入,隐式的直接用就可以,显式的参考dlopen系列函数   
  7\---------------------------------------------------------------   
  8  
  9一、动态链接库头文件   
 10  
 11\---------- adatetime.h ----------------   
 12  
 13#ifndef __DATETIME_H   
 14  
 15#define __DATETIME_H   
 16  
 17typedef struct   
 18  
 19{   
 20  
 21int year;   
 22  
 23int mon;   
 24  
 25int day;   
 26  
 27}DATETYPE;   
 28  
 29  
 30  
 31typedef struct   
 32  
 33{   
 34  
 35char hour;   
 36  
 37char min;   
 38  
 39char sec;   
 40  
 41}TIMETYPE;   
 42  
 43  
 44  
 45int getdate(DATETYPE *d); /* 取当前日期 */   
 46  
 47int gettime(TIMETYPE *t); /* 取当前时间 */   
 48  
 49  
 50  
 51#endif   
 52  
 53  
 54  
 55二、正确编译与命名动态链接库: g++ -shared -fPIC -Wall -o libMy.so getdate.cc gettime.cc   
 56  
 57  
 58########### Makefile ############   
 59obj = libmy.so   
 60CC = g++   
 61all : $(obj)   
 62SRC = getdate.cc gettime.cc   
 63TGT = $(SRC:.cc=.o)   
 64$(SRC) : adatetime.h   
 65@touch $@   
 66%.o : %.c   
 67$(CC) -c $?   
 68$(obj) : $(TGT)   
 69$(CC) -shared -fPIC -Wall -o $@ $(TGT)   
 70  
 71三、调用库的应用程序的编译   
 72  
 73######### makefile #############   
 74obj = ady   
 75CC = g++   
 76objlib = my   
 77libpath = /home/leng/test   
 78all : $(obj)   
 79SRC = ady.cc   
 80TGT = $(SRC:.cc=.o)   
 81$(SRC) : adatetime.h   
 82@touch $@   
 83%.o : %.cc   
 84$(CC) -c $?   
 85$(obj) : $(TGT)   
 86$(CC) -L$(libpath) -l$(objlib) -o $@ $(TGT)   
 87  
 88注: 曾试图采用-L`pwd`,编译失败!   
 89  
 90  
 91  
 92四、 代码   
 93  
 94\-------------- ady.cc -------------   
 95#include "stdio.h"   
 96#include "adatetime.h"   
 97int main(int argc,char **argv)   
 98{   
 99DATETYPE d;   
100TIMETYPE t;   
101getdate(&amp;d);   
102printf("date = %04d-%02d-%02d\n",d.year,d.mon,d.day);   
103gettime(&amp;t);   
104printf("time = %02d:%02d:%02d\n",t.hour,t.min,t.sec);   
105return 0;   
106}   
107  
108\----------------- getdate.cc ----------------------   
109  
110#include "time.h"   
111#include "adatetime.h"   
112  
113int getdate(DATETYPE *d)   
114{   
115long ti;   
116struct tm *tm;   
117  
118time(&amp;ti);   
119tm=localtime(&amp;ti);   
120d-&gt;year=tm-&gt;tm_year+1900;   
121d-&gt;mon=tm-&gt;tm_mon+1;   
122d-&gt;day=tm-&gt;tm_mday;   
123}   
124  
125\----------------- gettime.cc ------------------------   
126  
127#include "time.h"   
128#include "adatetime.h"   
129  
130int gettime(TIMETYPE *t)   
131{   
132long ti;   
133struct tm *tm;   
134time(&amp;ti);   
135tm=localtime(&amp;ti);   
136t-&gt;hour=tm-&gt;tm_hour;   
137t-&gt;min=tm-&gt;tm_min;   
138t-&gt;sec=tm-&gt;tm_sec;   
139}   
140  
141  
142\--------------------- end ---------------------------   
143  
144详细内容可以参见《advance in Dynamic Library   
145  
146\----------------- automake --------------------------   
147  
148################### DLL ###################   
149  
150% autoscan   
151  
152% mv configure.scan configure.in   
153  
154% vi configure.in   
155  
156AC_PROREQ(2.57)   
157  
158AC_INIT(libmy.so,1.0)   
159  
160AC_CONFIG_SRCDIR([adatetime.h])   
161  
162AM_INIT_AUTOMAKE(libmy.so, 1.0)   
163  
164AC_PROG_CC   
165  
166AC_OUTPUT(Makefile-lib)   
167  
168  
169  
170% aclocal   
171  
172% autoconf   
173  
174  
175  
176编辑 Makefile.am 档,内容如下   
177  
178AUTOMAKE_OPTIONS= foreign   
179  
180bin_PROGRAMS= libmy.so   
181  
182libmy_so_SOURCES= gettime.cc getdate.cc   
183  
184  
185  
186执行 automake --add-missing Automake 会产生 Makefile-lib.in   
187  
188% automake --add-missing   
189  
190编辑 Makefile-lib.in   
191  
192LDFLAGS =@LDFLAGS@ -shared   
193  
194CXXFLAGS = @CXXFLAGS@ -fPIC -Wall   
195  
196执行 configuremake    
197  
198% ./configure   
199  
200% make -f makefile-lib   
201  
202  
203  
204################## Application ##############   
205  
206% autoscan   
207  
208% mv configure.scan configure.in   
209  
210% vi configure.in   
211  
212AC_PROREQ(2.57)   
213  
214AC_INIT(ady,1.0)   
215  
216AC_CONFIG_SRCDIR([adatetime.h])   
217  
218AM_INIT_AUTOMAKE(ady, 1.0)   
219  
220AC_PROG_CC   
221  
222AC_OUTPUT(Makefile)   
223  
224  
225  
226% aclocal   
227  
228% autoconf   
229  
230  
231  
232编辑 Makefile.am 档,内容如下   
233  
234AUTOMAKE_OPTIONS= foreign   
235  
236bin_PROGRAMS= ady   
237  
238ady_SOURCES= ady.cc   
239  
240  
241  
242执行 automake --add-missing Automake 会产生 Makefile.in   
243  
244% automake --add-missing   
245  
246编辑 Makefile.in   
247  
248LDFLAGS = -L./ -lmy   
249  
250CXXFLAGS =   
251  
252执行 configuremake    
253  
254% ./configure   
255  
256% make</gnu>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus