当前位置: 技术问答>linux和unix
怎样编写和编译动态库
来源: 互联网 发布时间:2015-07-10
本文导语: 我想写点简单的有动态库的程序,但不知道如何下手,请各位高手指点(提供相关的学习资料,链接也可,或可以直接贴一个完整的源程序): 关于头文件有什么要求? 在主程序、库文件中要添加写什信息? Makefile...
我想写点简单的有动态库的程序,但不知道如何下手,请各位高手指点(提供相关的学习资料,链接也可,或可以直接贴一个完整的源程序):
关于头文件有什么要求?
在主程序、库文件中要添加写什信息?
Makefile 文件要怎样写?
各文件的路径的安排?……
先谢了!
关于头文件有什么要求?
在主程序、库文件中要添加写什信息?
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是标准前缀,系统会自动添加,必要花蛇添足:)
已经比较清楚了,具体的更多的编译选项可以多去查些资料,中都有说明.
[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是标准前缀,系统会自动添加,必要花蛇添足:)
已经比较清楚了,具体的更多的编译选项可以多去查些资料,中都有说明.
|
一、动态链接库头文件
---------- adatetime.h ----------------
#ifndef __DATETIME_H
#define __DATETIME_H
typedef struct
{
int year;
int mon;
int day;
}DATETYPE;
typedef struct
{
char hour;
char min;
char sec;
}TIMETYPE;
int getdate(DATETYPE *d); /* 取当前日期 */
int gettime(TIMETYPE *t); /* 取当前时间 */
#endif
二、正确编译与命名动态链接库: g++ -shared -fPIC -Wall -o libMy.so getdate.cc gettime.cc
########### Makefile ############
obj = libmy.so
CC = g++
all : $(obj)
SRC = getdate.cc gettime.cc
TGT = $(SRC:.cc=.o)
$(SRC) : adatetime.h
@touch $@
%.o : %.c
$(CC) -c $?
$(obj) : $(TGT)
$(CC) -shared -fPIC -Wall -o $@ $(TGT)
三、调用库的应用程序的编译
######### makefile #############
obj = ady
CC = g++
objlib = my
libpath = /home/leng/test
all : $(obj)
SRC = ady.cc
TGT = $(SRC:.cc=.o)
$(SRC) : adatetime.h
@touch $@
%.o : %.cc
$(CC) -c $?
$(obj) : $(TGT)
$(CC) -L$(libpath) -l$(objlib) -o $@ $(TGT)
注: 曾试图采用-L`pwd`,编译失败!
四、 代码
-------------- ady.cc -------------
#include "stdio.h"
#include "adatetime.h"
int main(int argc,char **argv)
{
DATETYPE d;
TIMETYPE t;
getdate(&d);
printf("date = %04d-%02d-%02dn",d.year,d.mon,d.day);
gettime(&t);
printf("time = %02d:%02d:%02dn",t.hour,t.min,t.sec);
return 0;
}
----------------- getdate.cc ----------------------
#include "time.h"
#include "adatetime.h"
int getdate(DATETYPE *d)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
d->year=tm->tm_year+1900;
d->mon=tm->tm_mon+1;
d->day=tm->tm_mday;
}
----------------- gettime.cc ------------------------
#include "time.h"
#include "adatetime.h"
int gettime(TIMETYPE *t)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
t->hour=tm->tm_hour;
t->min=tm->tm_min;
t->sec=tm->tm_sec;
}
--------------------- end ---------------------------
详细内容可以参见《advance in Dynamic Library》
----------------- automake --------------------------
################### DLL ###################
% autoscan
% mv configure.scan configure.in
% vi configure.in
AC_PROREQ(2.57)
AC_INIT(libmy.so,1.0)
AC_CONFIG_SRCDIR([adatetime.h])
AM_INIT_AUTOMAKE(libmy.so, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile-lib)
% aclocal
% autoconf
编辑 Makefile.am 档,内容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= libmy.so
libmy_so_SOURCES= gettime.cc getdate.cc
执行 automake --add-missing ,Automake 会产生 Makefile-lib.in
% automake --add-missing
编辑 Makefile-lib.in
LDFLAGS =@LDFLAGS@ -shared
CXXFLAGS = @CXXFLAGS@ -fPIC -Wall
执行 configure和make ,
% ./configure
% make -f makefile-lib
################## Application ##############
% autoscan
% mv configure.scan configure.in
% vi configure.in
AC_PROREQ(2.57)
AC_INIT(ady,1.0)
AC_CONFIG_SRCDIR([adatetime.h])
AM_INIT_AUTOMAKE(ady, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile)
% aclocal
% autoconf
编辑 Makefile.am 档,内容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= ady
ady_SOURCES= ady.cc
执行 automake --add-missing ,Automake 会产生 Makefile.in
% automake --add-missing
编辑 Makefile.in
LDFLAGS = -L./ -lmy
CXXFLAGS =
执行 configure和make ,
% ./configure
% make
---------- adatetime.h ----------------
#ifndef __DATETIME_H
#define __DATETIME_H
typedef struct
{
int year;
int mon;
int day;
}DATETYPE;
typedef struct
{
char hour;
char min;
char sec;
}TIMETYPE;
int getdate(DATETYPE *d); /* 取当前日期 */
int gettime(TIMETYPE *t); /* 取当前时间 */
#endif
二、正确编译与命名动态链接库: g++ -shared -fPIC -Wall -o libMy.so getdate.cc gettime.cc
########### Makefile ############
obj = libmy.so
CC = g++
all : $(obj)
SRC = getdate.cc gettime.cc
TGT = $(SRC:.cc=.o)
$(SRC) : adatetime.h
@touch $@
%.o : %.c
$(CC) -c $?
$(obj) : $(TGT)
$(CC) -shared -fPIC -Wall -o $@ $(TGT)
三、调用库的应用程序的编译
######### makefile #############
obj = ady
CC = g++
objlib = my
libpath = /home/leng/test
all : $(obj)
SRC = ady.cc
TGT = $(SRC:.cc=.o)
$(SRC) : adatetime.h
@touch $@
%.o : %.cc
$(CC) -c $?
$(obj) : $(TGT)
$(CC) -L$(libpath) -l$(objlib) -o $@ $(TGT)
注: 曾试图采用-L`pwd`,编译失败!
四、 代码
-------------- ady.cc -------------
#include "stdio.h"
#include "adatetime.h"
int main(int argc,char **argv)
{
DATETYPE d;
TIMETYPE t;
getdate(&d);
printf("date = %04d-%02d-%02dn",d.year,d.mon,d.day);
gettime(&t);
printf("time = %02d:%02d:%02dn",t.hour,t.min,t.sec);
return 0;
}
----------------- getdate.cc ----------------------
#include "time.h"
#include "adatetime.h"
int getdate(DATETYPE *d)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
d->year=tm->tm_year+1900;
d->mon=tm->tm_mon+1;
d->day=tm->tm_mday;
}
----------------- gettime.cc ------------------------
#include "time.h"
#include "adatetime.h"
int gettime(TIMETYPE *t)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
t->hour=tm->tm_hour;
t->min=tm->tm_min;
t->sec=tm->tm_sec;
}
--------------------- end ---------------------------
详细内容可以参见《advance in Dynamic Library》
----------------- automake --------------------------
################### DLL ###################
% autoscan
% mv configure.scan configure.in
% vi configure.in
AC_PROREQ(2.57)
AC_INIT(libmy.so,1.0)
AC_CONFIG_SRCDIR([adatetime.h])
AM_INIT_AUTOMAKE(libmy.so, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile-lib)
% aclocal
% autoconf
编辑 Makefile.am 档,内容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= libmy.so
libmy_so_SOURCES= gettime.cc getdate.cc
执行 automake --add-missing ,Automake 会产生 Makefile-lib.in
% automake --add-missing
编辑 Makefile-lib.in
LDFLAGS =@LDFLAGS@ -shared
CXXFLAGS = @CXXFLAGS@ -fPIC -Wall
执行 configure和make ,
% ./configure
% make -f makefile-lib
################## Application ##############
% autoscan
% mv configure.scan configure.in
% vi configure.in
AC_PROREQ(2.57)
AC_INIT(ady,1.0)
AC_CONFIG_SRCDIR([adatetime.h])
AM_INIT_AUTOMAKE(ady, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile)
% aclocal
% autoconf
编辑 Makefile.am 档,内容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= ady
ady_SOURCES= ady.cc
执行 automake --add-missing ,Automake 会产生 Makefile.in
% automake --add-missing
编辑 Makefile.in
LDFLAGS = -L./ -lmy
CXXFLAGS =
执行 configure和make ,
% ./configure
% make
|
http://www.csdn.net/Develop/read_article.asp?id=23194
|
建议你先看看书,GNU/Linux编程指南有一节专门将这个!
|
1、头文件中声明需要被调用的函数,类声明,需要导出的变量,没有特别的要求
2、编译连接时使用-shared选项,扩展名使用so就可以了
3、使用分为显式装入和隐式装入,隐式的直接用就可以,显式的参考dlopen系列函数
2、编译连接时使用-shared选项,扩展名使用so就可以了
3、使用分为显式装入和隐式装入,隐式的直接用就可以,显式的参考dlopen系列函数