Makefile 编译静态库文件及链接静态库
本文为原创文章,转载需指明该文链接
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 编译静态库文件及链接静态库的更多相关文章
- Makefile 编译动态库文件及链接动态库
本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...
- 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件
本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...
- 使用makefile编译多个文件(.c , .cpp , .h等)
有时候我们要一次运行多个文件,这时候我们可以使用Makefile!!! ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执 ...
- rpm安装找不到.so库文件(linux动态库连接的相关知识)(转)
1.找不到库文件的原因 库文件不存在 这种情况一般是因为所需要的包没装,只要安装相应的包就可以解决 存在而系统不知道 这种情况一般出现在自己编译软件时候 确保库文件所在的路径已加入系统,在/etc/l ...
- 由动态库文件dll生成lib库文件
本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...
- 利用caffe自带的Makefile编译自定义so文件
1.文件目录结构 caffe-root |--include |--example |--modules |--test.h |--test.cpp |--python |--src |--tools ...
- 将.lib库文件转换成.a库文件的工具
分享如下两个链接: 微盘: http://vdisk.weibo.com/s/ztzPTJIC52mz2 百度云盘: http://pan.baidu.com/s/11gTOc 使用方法,解压文件mi ...
- Eclipse·如何关联Git库文件和添加JUint库
Eclipse创建工程并关联到文件(SVN或Git管理的代码文件) 新建java工程,用于存放工程的一些信息,默认存放地址. 工程相关的信息是不需要提交到(SVN或Git)版本库的,所以工程存放到本地 ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
随机推荐
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...
- CenterNet算法笔记(目标检测论文)
论文名称:CenterNet: Keypoint Triplets for Object Detectiontection 论文链接:https://arxiv.org/abs/1904.08189 ...
- phpstorm设置的快捷键突然失效了,提示: IdeaVim ...
下班后,打开PHPstorm,突然感觉不对,经常用的快捷键突然用不了. 例如按了 Ctrl+F 快捷键后,提示: IdeaVim! Using the Ctrl+F shortcut for Vim ...
- [转帖]判断Linux进程在哪个CPU核运行的方法
判断Linux进程在哪个CPU核运行的方法 原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问 ...
- SQL SERVER DATEPART函数
定义: DATEPART函数返回指定日期的指定部分. 语法: DATEPART(datepart,date) 参数: ①datepart 参数可以是下列的值: datepart 缩写 年(Year) ...
- DOS bcp
C:\>bcp /?用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件 [-m 最大错误数] [ ...
- 小菜鸟之HTML常用
html的基本结构是什么? 表示段落标签是什么?<p> 表示标题标签的是什么?<title>Css标签样式</title> 表示区域标签的是什么?<div&g ...
- ArrayList与LinkedList的区别,如何减少嵌套循环的使用
如果要减少嵌套循环的使用: 我们可以将需要在二重循环里面判断的条件放在一个Map的key里面: 在判断的时候只需要进行key是否存在,然后操作接下来的步骤: 这样子就会减少二重循环了,不会发生循环n* ...
- PAT B1015A1062德才论(25)
题目描述 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...
- 石子合并(直线版+环形版)&(朴素写法+四边形优化+GarsiaWachs算法)
石子合并-直线版 (点击此处查看题目) 朴素写法 最简单常见的写法就是通过枚举分割点,求出每个区间合并的最小花费,从而得到整个区间的最小花费,时间复杂度为O(n^3),核心代码如下: ; i < ...