makefile学习经验(四)编译生成动态库文件(方式二)

摘要:
在Lunix下生成动态库文件:我们已经描述了如何使用makefile文件实现可执行文件。现在让我们指定源文件中加载的动态库文件;1、 源代码文件:datetime h:#ifndef_datetime_h#define_datetime_h/*日期结构*/typedefstruct{intyear;intmon;intday;}日期类型;/*时间结构*/typedefstruct{charhou

Lunix下生成动态库文件:

         之前已经介绍了依靠makefile文件实现可执行文件,下面说下在源文件中指定加载的动态库文件;

一.   源码文件:

datetime.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;

 /* 函数原型说明 */

 #ifdef SHARED

         int (*getdate)(DATETYPE *d);

 #else

         int getdate(DATETYPE *d);

 #endif

 #ifdef SHARED

         int (*gettime)(TIMETYPE *t);

 #else

         int gettime(TIMETYPE *t);

 #endif

#endif

getdate.c:

#include "time.h"

#include "datetime.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.c:

#include "time.h"

#include "datetime.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;

}

dy.c:

#include "stdio.h" /* 包含标准输入输出文件 */

#include "dlfcn.h" /* 包含动态链接功能接口文件 */

#define SOFILE "../lib/libmy.so" /* 指定动态链接库名称 */

#define SHARED /* 定义宏,确认共享,以便引用动态函数 */

#include "datetime.h" /* 包含用户接口文件 */

 main()

 {

         DATETYPE d;

         TIMETYPE t;

         void *dp;

         char *error;

         puts("获取当前时间");

         dp=dlopen(SOFILE,RTLD_LAZY); /* 打开动态链接库 */

         if (dp==NULL) /* 若打开失败则退出 */

         {

                   fputs(dlerror(),stderr);

                   exit(1);

         }

         getdate=dlsym(dp,"getdate"); /* 定位取日期函数 */

     error=dlerror(); /* 检测错误 */

          if (error) /* 若出错则退出 */

          {

                   fputs(error,stderr);

                   exit(1);

          }

          getdate(&d); /* 调用此共享函数 */

          printf("当前日期: %04d-%02d-%02d\n",d.year,d.mon,d.day);

          gettime=dlsym(dp,"gettime"); /* 定位取时间函数 */

          error=dlerror(); /* 检测错误 */

          if (error) /* 若出错则退出 */

          {

                   fputs(error,stderr);

                   exit(1);

          }

          gettime(&t); /* 调用此共享函数 */

          printf("当前时间: %02d:%02d:%02d\n",t.hour,t.min,t.sec);

          dlclose(dp); /* 关闭共享库 */

          exit(0); /* 成功返回 */

}

二.对源文件阐述:

         dy.c文件中:

  1. #include "dlfcn.h" /* 包含动态链接功能接口文件 */
  2. #define SOFILE "../lib/libmy.so" /* 指定动态链接库名称 */
  3. dp=dlopen(SOFILE,RTLD_LAZY); /* 打开动态链接库 */
  4. error=dlerror();
  5. dlclose(dp); /* 关闭共享库 */

以上是在源文件中链接动态库文件常用命令;

三.Makefile文件:

#*****************************************************************************

# Copyright        :  

#

# Author           :   huochangjun

# Date             :   2012-08-15

# Version          :   Demo1

# Description  :   Demo

#

#****************************************************************************/

SHELL = /bin/sh

LIB_DIR = /cbs/lhbb/hcj/test/lib/

BIN_DIR = /cbs/lhbb/hcj/test/bin/

OBJECT_DIR = /cbs/lhbb/hcj/test/obj/

APP_DIR = /cbs/lhbb/hcj/test/testapp/

$(shell mkdir -p ${LIB_DIR})

$(shell mkdir -p ${BIN_DIR})

$(shell mkdir -p ${OBJECT_DIR})

RM = rm -fr

#****************************************************************************

CC = gcc

SHARED = -shared -o

FPIC = -fPIC -c

RDY     = -rdynamic -s

SRC_OBJECT = $(APP_DIR)getdate.c $(APP_DIR)gettime.c

H_OBJECT = $(APP_DIR)datetime.h

OBJECT = getdate.o gettime.o

DY_SRC_OBJECT = $(APP_DIR)dy.c

DY_OBJECT=dy.o

LIB_OBJECT = libmy.so

BIN_OBJECT = dy

#****************************************************************************

.PHONY:all

all:$(LIB_OBJECT) $(BIN_OBJECT)

$(LIB_OBJECT):$(OBJECT)

        $(CC) $(OBJECT) $(SHARED) -fPIC -o $(LIB_OBJECT) 

        mv $(LIB_OBJECT) $(LIB_DIR)

$(OBJECT):$(SRC_OBJECT) $(H_OBJECT)

        $(CC) $(FPIC) $(SRC_OBJECT)

$(BIN_OBJECT):$(DY_OBJECT)

        $(CC) $(RDY) -o $(BIN_OBJECT) $(OBJECT_DIR)$(DY_OBJECT) -ldl -L$(LIB_DIR) -lmy

        mv $(BIN_OBJECT) $(BIN_DIR)

$(DY_OBJECT):$(DY_SRC_OBJECT)

        $(CC) -c $(DY_SRC_OBJECT) -o $(DY_OBJECT)

        mv $(OBJECT) $(DY_OBJECT) $(OBJECT_DIR)

clean:

        $(RM) $(LIB_DIR) $(BIN_DIR) $(OBJECT_DIR)

四.makefile文件的简单阐述:

基本的变量赋值在生成静态库文件已经介绍了,这边就不再重复了。

和上一篇中加载不同的是,编译的命令不同:

1. $(CC) $(RDY) -o $(BIN_OBJECT) $(OBJECT_DIR)$(DY_OBJECT) -ldl -L$(LIB_DIR) -lmy

---- $(RDY):-rdynamic 指定输出文件为动态链接方式;

                –s  指定删除目标文件中的符号表

                -ldl 装配程序ld要装载dl函数库;

免责声明:文章转载自《makefile学习经验(四)编译生成动态库文件(方式二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇修复Visual Studio 2010 SP1的Toolbox导致的VS不可用Java常用类库与技巧下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gcaufy 导语 Bugly 之前发了一篇关于微信小程序的开发经验分享(点击阅读),小伙伴们在公众账号后台问了很多关于小程序开发方面的问题,精神哥在查阅相关内容...

Windows下用Eclipse配合CDT+MinGW编译环境的建立

Eclipse是一款用Java编写的优秀的开源'壳'软件,其自身不带编译器连接器,使用时需要自己进行编译器连接器的配置工作,可以说灵活性非常大,通过添加插件可以支持多种语言。本来大家使用Eclipse是用来写Java程序的,但是通过合理的配置,完全可以使用开源的gcc编译器来进行C,C++的编写工作。这样一来可以在Eclipse编写控制台程序、编写GTK或...

小型C/C++项目的makefile编写

【前言】在我所接触到的Linux嵌入式开发中,大多使用的是C语言,采用makefile文件对源文件进行编译后生成可执行文件。本文即从个人经历上介绍小型的C项目如何编写makefile文档。 一、gcc命令 从目的上看,gcc命令和makefile的功能是一样,即是把源文件编译后生成可执行文件或.o二进制文件。gcc命令中有许多的额外的参数,本文仅介绍以下几...

linux中的strip命令简介------给文件脱衣服【转】

转自:http://blog.csdn.net/stpeace/article/details/47090255 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。 作为一名Linux开发人员, 如果没有听说过strip命令, 那是很不应该的。 strip这个单词, 大家应该早就学过了...

Zookeeper 3.5.7搭建(启用Kerberos)

Zookeeper 3.5.7搭建(启用Kerberos) 标签(空格分隔): zookeeper 一,Zookeeper 3.5.7组件搭建步骤 1,Zookeeper 搭建 (全集群 hosts 文件,profile 系统环境变量文件在所有机器均全部同步完毕),且/etc/profile append 文件如下: # HADOOP CONFIG ex...

后端开发工程师的开发环境配置(Vscode+C/Go/Python等)

前言         我是一名后端开发工程师,主要语言是C、Go、Python。早年做C开发的时候都是在windows下开发,一直使用的是soure insight,尤其是时隔多年更新的4.0版本解决了中文乱码等问题,用起来更是得心应手。后来转到Mac下开发,虽然可以用wine运行windows程序,但总感觉别扭,也是时候做一些新的尝试了。      ...