当前位置:  技术问答>linux和unix

怎样编写和编译动态库

    来源: 互联网  发布时间:2015-07-10

    本文导语:  我想写点简单的有动态库的程序,但不知道如何下手,请各位高手指点(提供相关的学习资料,链接也可,或可以直接贴一个完整的源程序): 关于头文件有什么要求? 在主程序、库文件中要添加写什信息? 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是标准前缀,系统会自动添加,必要花蛇添足:)

已经比较清楚了,具体的更多的编译选项可以多去查些资料,中都有说明.

|
一、动态链接库头文件

  ----------        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系列函数

    
 
 

您可能感兴趣的文章:

  • 如何编写Makefile,使得只编译改变的文件
  • 使用editplus编写java如何编译成字节码文件,如何解释
  • 用jbuilder 编写的appliction 程序,如何独立于jbuilder 编译器之外运行?
  • 自己编写一个程序编译进内核,要修改makefile文件吗?
  • vc编写dll动态连接库(编译过的)能在unix上开发使用吗?
  • jbuilder7问题 编译没有问题,内部运行编写的的java程序就退出了???
  • 编译和使用自己编写的linux内核模块的问题
  • 各位ggmm,问一个简单问题,在编写完ejb的三个文件后,怎么将其编译成。class文件?
  • 请问如何可以方便的使用UltraEdit来编写、编译Java程序?
  • 入门者的问题:我在UNIX的环境下,编写了c程my.c,编译后生成 my*,可是用什么命令执行这个程序呀?
  • 能不能告诉我使用editplus编写java如何编译成字节码文件,如何解释?,虽然问题简单一点,可对我很需要
  • 根据Java提供的.class的文件结构我们可以编写出针对.class文件的反编译程序吗?
  • 关于editplus的使用,编译完生成.class后,我又编写了html来执行applet,将其保存,如何经ie解释打开(直接在editplus上操作)不是显示html语言呀
  • 如何可以方便的使用UltraEdit来编写、编译 运行Java程序?当类在一个包里面时怎样设置?
  • 解救远程编码的coder, 使用VC+VA编写/编译/运行/调试linux程序
  • 下载了一个用ffmpeg的libavcodec和libavformat编写的播放器程序,编译总失败???
  • 如何在便编写一个makefile,使其编译时能产生可执行文件?急!谢谢帮忙!
  • 用Qt3.1.4编写的程序,如何加入自己编写的另外一个动态库呀?诚恳指教!!
  • 关于动态库的Makefile的编写
  • 用Qt3.1.4编写的程序,如何加入动态库呀?诚恳指教!!
  • 请问:在UINX如何编写、使用动态连接库???
  • Unix里编写动态库时会不会像Windows一样在源代码中含有Dllmain()类似的主函数?
  • 如何编写自己的动态链结库与static lib,如何调用他们,希望详细一点
  • [请教]怎样获得共享库(动态连接库)中函数的原型以便编写专用库来覆盖它?
  • NOSQL iis7站长之家
  • Linux中有没有类似Windows中的动态链接库的东东?怎么编写的?
  • 如何编写动态库的makefile
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 编写 linux shell 有什么好的编写工具呢?
  • VB编写的DLL不能被JAVA调用,用C将VB编写的DLL包装起来,做成一个新的DLL;用C编写的DLL可以被JAVA调用,用JAVA再进行一层的包装,因为JAV
  • 如图 scsi <---> scsi controller <---> pci <---> cpu 如果我想对scsi编写驱动我该对哪个部分编写?
  • 用什么工具编写JSP,可以象用InterDev编写ASP一样方便快捷?
  • 编写程序如编写人生,有人和我的意见相同吗?
  • 请问用jsp编写程序,非要编写代码么?有没有什么象fontpage2000那样的工具,能够生成一些固定模板的工具?就是说不用全部都写的工具。望
  • 用jsp编写web程序到底和java serverlet编写web程序有和区别
  • socket中,从client端(用java编写的)传到server端(用c编写的)的字符串为何总多一个ASCII码为10的字符呀?
  • 如何用java编写一个NT平台下的标准服务?
  • 关于用vj编写sniffer一问。
  • Linux下如何编写脚本文件
  • java能不能编写单独运行的程序?
  • Linux有没有类似bat文件,如何编写。
  • 用JAVA编写COM组件
  • 关于版本和bug管理的rule(规则)的编写
  • 在windows下可以用Code::Blocks编写linux程序吗?
  • 函数互相调用时Makefile编写
  • linux下用java编写邮箱客户端程序与在windows下有什么不同??
  • AIX下如何编写批处理命令和计划任务
  • 怎么用JBuild编写java console程序


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3