简单静态库与动态库的创建以及Makefile基本使用

原创 2017年04月24日 17:37:26

1.linux中的动态库和静态库的区别:
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 
 
2.源程序包含:log.c  main.c(主程序)  log.h
将在下边贴出。

3-1.静态库的创建以及使用:

gcc  -c  log.c                 |生成 log.o 文件
ar  cr  libstatic.a  log.o     |创建静态库libstatic.a 并将 .o 问价链接到 .a 文件中
gcc  main.c  -L.  libstatic.a  log.h  -o  out    |-L:链接库  .:表示当前目录 后跟要链接的库和头文件, 生成可执行程序out
3-2.使用Makefile创建静态库
Makefile内容:
src=$(wildcard *.c)
obj=$(patsubst %.c, %.o, $(src))

test:libstatic.a edit
%.o:%.c
@ gcc -c $< -o $@
libstatic.a:$(obj)
@ar cr $@ $^
edit:$(obj)
@ gcc $^ -o $@
clean:
@ rm -rf *.o
.PHONY:clean
del:
@ rm -rf edit
.PHONY:del

4-1.动态库的创建以及使用:
        gcc -c -fPIC log.c    |生成位置无关的.o文件   -fPIC
gcc -shared -o libdynamic.so log.o   | 生成.so文件
        gcc main.c -L. libdynamic.so log.h -o out | 生成可执行程序out


  注意:结果出乎意料,编译的时候没问题,由于指定了-L.选项,编译器可以在当前目录下找

到libdynamic.so,而运行时却说找不到libdynamic.so
1.在运行out时通过环境变量LD_LIBRARY_PATH把当前目录添加到共享库的搜索
路径:LD_LIBRARY_PATH=. ./out
2.这是最常用的方法。把libdynamic.so所在目录的绝对路径(比如/home/akaedu/somedir)添加到/etc/ld.so.conf中(该文件中每个路径占一行),然后运行ldconfig
3.第三种方法就是把libdynamic.so拷到/usr/lib或/lib目录,这样可以确保动态链接器能找到这个共享
库。
4.在编译可执行文件out的时候就把libdynamic.so的路径写死在可执行文件中
4-2.使用Makefile创建动态库
Makefile内容:
src=$(wildcard *.c)
obj=$(patsubst %.c, %.o, $(src))


test:libdynamic.so edit
%.o:%.c
@ gcc -c -fPIC $< -o $@
libdynamic.so:$(obj)
@ gcc -shared -o $@ $^
edit:$(obj)
@ gcc $^ -o $@
clean:
@ rm -rf *.o
.PHONY:clean
del:
@ rm -rf edit
.PHONY:del

5.源代码

      1).  log.c

#include "log.h"
#include <time.h>
#include <stdarg.h>
#define SIZE 1024L
#define LSIZE 0L

//#define ERR(...)  write_log(fd, __VA_ARGS__)
//#define DEB(...)  write_log(fd, __VA_ARGS__)

static int fd;
static struct stat sta;
static char buffer[15] = {0};
static char err[30] = "  ERR|发生错误\012";
static char deb[30] = "  DEB|调试正常";


/*#define write_log(...) do{\
    localtime_log();\
    int wr;\
    if((wr = write(fd, buffer, strlen(buffer))) < 0)\
            perror("write");\
    write(fd, err, strlen(err));\
    }while(0)
*/

long int stat_log(void)
{
    int st;
    if((st=fstat(fd, &sta)) == -1)
            perror("stat");

    return sta.st_size;
}

void localtime_log(void)
{
    time_t t;
    struct tm *tim;
    tim = localtime(&t);
    strcpy(buffer, "");
    sprintf(buffer, "扫描时间:%04d-%02d-%02d %02d:%02d:%02d", tim->tm_year+1947,
            tim->tm_mon+3, tim->tm_mday+4, tim->tm_hour, tim->tm_min, tim->tm_sec);

    return;
}

void ftruncate_log(void)
{
    int ftc;
    if((ftc = ftruncate(fd, 0L)) == -1)
        perror("ftruncate");
        char buf[40] = "日志\012\012日志内容\012------------------\012";
            write(fd, buf, sizeof(buf));
       
            localtime_log();
            int wr;
            if((wr = write(fd, buffer, strlen(buffer))) < 0)
                perror("write");
            write(fd, "\012", 1);


    return;
}

void errwr_log(void)
{
    localtime_log();
    int wr;
    if((wr = write(fd, buffer, strlen(buffer))) < 0)
        perror("write");
    write(fd, err, strlen(err));


    return;
}

void debwr_log(void)
{
    localtime_log();
    int wr;
    if((wr = write(fd, buffer, strlen(buffer))) < 0)
        perror("write");
    write(fd, deb, strlen(deb));

    return;
}

void open_log(const char* path)
{
     fd = open(path, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
    if(fd < 0){
        perror("open");
       fd = open("log.t",  O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
    }
    while(1){
    
        long int size = stat_log();
        if(size > SIZE){
            ftruncate_log(); 
        }

        else if (size == LSIZE){
             char buf[40] = "日志\012\012日志内容\012------------------\012";
             write(fd, buf, sizeof(buf));        
             localtime_log();
             int wr;
             if((wr = write(fd, buffer, strlen(buffer))) < 0)
                perror("write");
             write(fd, "\012", 1);

        }

        else{
            write(fd, "\012", 1);
            //ERR(err, strlen(err));
            //DEB(deb, strlen(deb));
            errwr_log();
            debwr_log();
        }

    }

    close(fd);
 
    return;
}

   2).  log.h

#ifndef  _LOG_H
#define
   _LOG_H
#include
 <sys/types.h>
#include
 <sys/stat.h>
#include
 <fcntl.h>
#include
 <errno.h>
#include
 <string.h>
#include
 <stdio.h>
#include
 <unistd.h>
void
 open_log ( const char *path ) ;
#endif

   3).  main.c

#include "log.h"

int main(void)
{
   open_log("log.t");

   return 0;
}

6.其中log.c涉及linux下的常用文件操作文件,内容是简单模拟日志。


makefile模板(可执行文件,动态库,静态库)

可执行文件:
  • zy799894671
  • zy799894671
  • 2014年07月22日 15:18
  • 1170

Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

Ubuntu下makefile及gcc生成静态库动态库的简单使用举例
  • fengbingchun
  • fengbingchun
  • 2014年01月08日 10:45
  • 7795

编译动态库,静态库makefile简单模板

#编译静态库 AR=ar TARGET=xx.a obj= a.o b.o .... all:$(obj) $(AR) ruc $(TARGET) $^ %.o:%.c ...
  • happythanago
  • happythanago
  • 2016年11月01日 15:40
  • 165

makefile静态库 动态库

动态库调用另外一个静态库: CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)ld CFLAGS:=-fPIC LDFLAGS:=-shared -fpic SO...
  • najiutan
  • najiutan
  • 2016年01月19日 20:01
  • 1996

【Qt】Qt动态库和静态库的创建和使用

动态库(共享库)的创建在Qt Creator中新建项目,选择Library 点击“Choose”进入下一步选择创建库的类型:共享库选择Kit套件选择需要的模块配置工程路径、名字等Qt Creator...
  • u010168781
  • u010168781
  • 2017年11月16日 12:43
  • 207

Linux下Makefile中动态链接库和静态链接库的生成与调用

背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译、链接、生成可执行文件,从而实现了移植的过程。平台是Toradex的...
  • u011964923
  • u011964923
  • 2017年06月15日 20:14
  • 4898

gcc MakeFile文件引用静态库与动态库的区别

gcc MakeFile文件引用静态库与动态库的区别makefile文件引用库路径,如下: LIB_PATH += -L路径 makefile文件引用静态库/动态库,如下: LIBS += -l...
  • u012734708
  • u012734708
  • 2018年01月15日 16:17
  • 13

Vs2010 下的静态库、动态库的创建和调用

静态库和动态库的区别定义: 静态库:程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得...
  • bie_niu1992
  • bie_niu1992
  • 2015年05月13日 10:51
  • 1019

gcc链接g++编译生成的静态库和动态库的makefile示例

使用c++开发程序或者库时,将库提供给其他人使用。 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同。 首先是静态库,以链接g++编译生成的libmylib....
  • caoyaobin
  • caoyaobin
  • 2017年01月31日 12:17
  • 509

linux编译动态库和静态库的makefile示例

根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。1. 静态库的生成makefile命令的简介可参考:跟我一起写 Makefile。使用ar命令生成....
  • shaoxiaohu1
  • shaoxiaohu1
  • 2015年07月18日 16:07
  • 28884
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单静态库与动态库的创建以及Makefile基本使用
举报原因:
原因补充:

(最多只允许输入30个字)