我想写点简单的有动态库的程序,但不知道如何下手,请各位高手指点(提供相关的学习资料,链接也可,或可以直接贴一个完整的源程序):
关于头文件有什么要求?
在主程序、库文件中要添加写什信息?
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编程指南="">>中都有说明.
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(&d);
102printf("date = %04d-%02d-%02d\n",d.year,d.mon,d.day);
103gettime(&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(&ti);
119tm=localtime(&ti);
120d->year=tm->tm_year+1900;
121d->mon=tm->tm_mon+1;
122d->day=tm->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(&ti);
135tm=localtime(&ti);
136t->hour=tm->tm_hour;
137t->min=tm->tm_min;
138t->sec=tm->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执行 configure和make ,
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执行 configure和make ,
253
254% ./configure
255
256% make</gnu>