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解方程
一元一次方程 例题1: 这是北师大版小学六年级上册课本95页的一道解方程练习题: 大家可以先口算一下,这道题里面的x的值为200 接下来我们用python来实现,代码如下,每一句代码后面都写有解释语: ...
- 数学建模python matlab 编程(指派问题)
指派授课问题 现有A.B.C.D四门课程,需由甲.乙.丙.丁四人讲授,并且规定: 每人只讲且必须讲1门课:每门课必须且只需1人讲. 四人分别讲每门课的费用示于表中: 课 费用 人 A B C D 甲 ...
- CentOS8 缺少 libglade2 安装包的回避方法
某些gtk2应用程序需要libglade2安装包,但不知为何CentOS的yum仓库里没有此包, 经测试,可手动安装CentOS7的rpm包安装解决. 更新:使用下面一行即可.sudo yum ins ...
- ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门
敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...
- 【计算机视觉】UCLA开源图像检测器
UCLA (加州大学洛杉矶分校)发布了一个强大的图像检测软件的源码 ,该软件可以非常高速的检测每个图像的细节,例如可用于检测指纹和虹膜,或者用于自动驾驶.通过识别物体的边界进行提取.首先确定一个物体的 ...
- Maven跳过单元测试的两种方式
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...
- Linux切换root超级用户问题
具体方法如下: Ubuntu 1.使用终端工具的快捷键Ctrl + Alt +T 打开终端. 2.终端工具打开后如下图所示,操作就在这个窗口中进行 3.切换root用户的的方式一 执行命令 sudo ...
- 谈谈Java中的集合list、set、map之间的区别
参考文献:https://www.cnblogs.com/IvesHe/p/6108933.html 我这里只总结其区别,具体的说明,请查看参考文献,讲的很详细. A.list接口,实现子类有:arr ...
- 七牛云图床及MPIC工具使用
考虑到图片更容易被人接受,但是大量图片又会延迟博客加载速度.因此,个人感觉可以把静态文件资源托管在云端,这样加载的话就不至于太慢. 注册七牛云 实名验证通过 创建文件存储 内容管理-上传图片 下载Mp ...
- hdu 6601 区间条件极值 - 区间 最大 三角形周长
题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求其元素能构成三角形的最大周长.有多组测试. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n]); 数据结构 ...