本文为原创文章,转载需指明该文链接

1.代码目录结构如下:

 comm/errorhandler.c
comm/inc/apue.h
 3 atexit.c
Makefile
 5
staticlib/lib/
staticlib/inc/staticlibs.h
staticlib/staticlib_add.c
 9 staticlib/staticlib_mul.c
staticlib/Makefile

2.目录 staticlib/lib/ 是用来盛放静态库文件的——libmytest.a,在编译静态库之前该目录是空的

staticlib/inc/staticlibs.h 头文件内容如下:

1 #ifndef __staticlibs_h
#define __staticlibs_h int static_lib_func_add(int i1, int i2);
int static_lib_func_mul(int i1, int i2); 5 #endif

staticlib/staticlib_add.c 文件内容如下:

 #include "apue.h"
int static_lib_func_add(int i1, int i2)
{
int iret = i1 + i2;
printf("in a static library, return value %d\n", iret);
return iret;
}

staticlib/staticlib_mul.c 文件内容如下:

 #include "apue.h"

 int static_lib_func_mul(int i1, int i2)
{
int iret = i1 * i2;
printf("in a static library, return value is %d\n", iret);
return iret;
}

staticlib/Makefile 文件内容如下:

 CC        = gcc
CFLAGS = -Wall -O -g
CXXFLAGS =
INCLUDE = -I ./inc -I ../comm/inc
TARGET = libmytest.a
LIBPATH = ./lib/ vpath %.h ./inc OBJS = staticlib_add.o staticlib_mul.o
SRCS = staticlib_add.c staticlib_mul.c $(OBJS):$(SRCS)
$(CC) $(CFLAGS) $(INCLUDE) -c $^ all:$(OBJS)
ar rcs $(TARGET) $^          打包 .o 文件到库文件 libmytest.a 
mv $(TARGET) $(LIBPATH) clean:
rm -f *.o
rm -f $(LIBPATH)*

3.文件 atexit.c 的内容如下:

 #include "apue.h"
#include "staticlibs.h"   //包含静态库的头文件 static void my_exit1(void);
static void my_exit2(void); int main(void)
{
static_lib_func_add(, ); //静态库函数
static_lib_func_mul(, ); //静态库函数 if( != atexit(my_exit2))
err_sys("can't register my_exit2");
if( != atexit(my_exit1))
err_sys("can't register my_exit1");
if( != atexit(my_exit1))
err_sys("can't register my_exit1");
printf("main is done\n");
return ;
} static void my_exit1(void)
{
printf("first exit handler\n");
} static void my_exit2()
{
printf("second exit handler\n");
}

文件 Makefile 的内容如下:

 CC       = gcc
CFLAGS = -Wall -O -g
CXXFLAGS =
INCLUDE = -I ./comm/inc -I ./staticlib/inc
TARGET = atexit
LIBVAR = -lmytest 链接 libmytest.a
LIBPATH = -L./staticlib/lib
#search paths for errorhandler.c
vpath %.c ./comm
#下行是为依赖项 apue.h 准备的,比如 [errorhandler.o:errorhandler.c apue.h] 里的 apue.h
vpath %.h ./comm/inc OBJS = errorhandler.o atexit.o
#下行的 apue.h,可以不必写出来
errorhandler.o:errorhandler.c apue.h
$(CC) $(CFLAGS) $(INCLUDE) -c $^
atexit.o:atexit.c apue.h
$(CC) $(CFLAGS) $(INCLUDE) -c $^ all:$(OBJS) $(LIB)
cd ./staticlib && make all 执行staticlib/Makefile 里的 make all
$(CC) $(CFLAGS) $(INCLUDE) -o $(TARGET) $(OBJS) $(LIBVAR) $(LIBPATH) clean:
rm -f *.o
rm -f $(TARGET)
cd ./staticlib && make clean 执行staticlib/Makefile 里的 make clean

我在编译的过程中出现了 /usr/bin/ld: cannot find -lc,然后在系统上 locate libc.a,发现系统上没有 libc.a 静态库文件,

这是由于我的系统还没安装glibc的静态版本,安装 glibc-static-2.12-1.107.el6.x86_64.rpm 之后,就不再出现该问题。

Makefile 编译静态库文件及链接静态库的更多相关文章

  1. Makefile 编译动态库文件及链接动态库

    本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...

  2. 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...

  3. 使用makefile编译多个文件(.c , .cpp , .h等)

    有时候我们要一次运行多个文件,这时候我们可以使用Makefile!!! ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执 ...

  4. rpm安装找不到.so库文件(linux动态库连接的相关知识)(转)

    1.找不到库文件的原因 库文件不存在 这种情况一般是因为所需要的包没装,只要安装相应的包就可以解决 存在而系统不知道 这种情况一般出现在自己编译软件时候 确保库文件所在的路径已加入系统,在/etc/l ...

  5. 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...

  6. 利用caffe自带的Makefile编译自定义so文件

    1.文件目录结构 caffe-root |--include |--example |--modules |--test.h |--test.cpp |--python |--src |--tools ...

  7. 将.lib库文件转换成.a库文件的工具

    分享如下两个链接: 微盘: http://vdisk.weibo.com/s/ztzPTJIC52mz2 百度云盘: http://pan.baidu.com/s/11gTOc 使用方法,解压文件mi ...

  8. Eclipse·如何关联Git库文件和添加JUint库

    Eclipse创建工程并关联到文件(SVN或Git管理的代码文件) 新建java工程,用于存放工程的一些信息,默认存放地址. 工程相关的信息是不需要提交到(SVN或Git)版本库的,所以工程存放到本地 ...

  9. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

随机推荐

  1. 转:SpringMVC 4.1 新特性(二)内容协商视图

    SpingMVC的内容协商支持三种方式: 使用后缀,如json.xml后缀和处理类型的关系可以自己定义 前面说的使用Accept头 在访问时request请求的参数,比如每次请求request都会加f ...

  2. 执行kubelet卡、解决

    现象: 执行kubectl get po -o wide 非常卡.慢 原因: 修改node名称造成的, 解决: https://my.oschina.net/u/3390908/blog/164976 ...

  3. python-Web-django-图表统计

    下载highchart插件包,放在static下 <script src="/static/highcharts/highcharts.js"></script& ...

  4. 求帮助 html5三次贝塞尔曲线问题

    <!DOCTYPE html><html><head><meta charset="utf-8"> <title>can ...

  5. USACO 1.3 Name That Number【暴搜】

    裸的穷举搜索. 研究了好久怎么输入$dict.txt$,$USACO$好像对$freopen$的顺序还有要求? /* ID: Starry21 LANG: C++ TASK: namenum */ # ...

  6. SQL -------- JDBC 查询所有记录

    package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...

  7. python录音并调用百度语音识别接口

    #!/usr/bin/env python import requests import json import base64 import pyaudio import wave import os ...

  8. 阿里云服务器 lnmp安装流程

    nginx安装:wget http://nginx.org/download/nginx-1.12.2.tar.gztar zxvf nginx-1.12.2.tar.gzcd nginx-1.12. ...

  9. vue click.stop

    <div id="app"> <div v-on:click="dodo"> <button v-on:click="d ...

  10. Kefa and Dishes(CodeForces580D)【状态压缩DP】

    状态压缩DP裸题,比赛的时候没反应过来,进行了n次枚举起点的solve,导致超时. #include<cstdio> #include<iostream> #include&l ...