C语言中动态库/静态库的创建和使用
来源:互联网 发布:软件收费模式 编辑:程序博客网 时间:2024/06/02 07:12
C语言程序在开发过程中通常会使用遇到动态库或者是静态库函数的创建和使用,这里做简要的记录。
A.静态库函数的创建
1.源文件getSum.c
#include "getSum.h"int getSum( int a, int b ){ return a + b;}
2.头文件getSum.h#ifndef __STATIC_H__#define __STATIC_H__#include <stdio.h>extern int getSum( int a, int b ); #endif //__STATIC_H__
说明:extern关键字说明函数的定义来自其他源文件,这里可以省去(注:只在头文件做申明不定义)3. 静态库文件编译Makefile
############################################# NAME: Makefile for creating static libs# AUTHOR: HAMMING# TIME: 2017-10-26# VERSION: V1.0# MODIFY:############################################ 1、准备工作,编译方式、目标文件名、依赖库路径的定义。CC = gccCFLAGS := -Wall -O3# 头文件和lib(动态库或静态库)路径 INC_CANGHAI = /home/canhai/libUsage/libLIB_CANGHAI = /home/canhai/libUsage/libSRCS := $(wildcard *.c)OBJS := $(patsubst %.c, %.o, $(SRCS)) #.o文件与.c文件同名LIB = libmath2.a # 目标文件名 OPENCV_INC= -I $(INC_CANGHAI)# 指定使用到的头文件所在路径INCLUDE_PATH = $(OPENCV_INC)LIB_PATH = -L $(LIB_CANGHAI)# 指定链接库所在路径,编译过程中要使用到的库还是要以-lmath形式写出来# 依赖的lib名称OPENCV_LIB =all : $(LIB)# 2. 生成.o文件 %.o : %.c# 这里也可以写成.c.o的形式 $(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) # 3. 生成静态库文件$(LIB) : $(OBJS) rm -f $@ ar -r $@ $(OBJS) rm -f $(OBJS)tags : ctags -R *# 4. 删除中间过程生成的文件 clean: rm -f $(OBJS) $(TARGET) $(LIB)
B.动态库函数的创建
1.源文件getReduce.c
#include "getReduce.h"int getReduce( int a, int b ){ return a - b;}
2.头文件的创建getReduce.h#ifndef __DYNAMIC_H__#define __DYNAMIC_H__#include <stdio.h>extern int getReduce( int a, int b);#endif //__DYNAMIC_H__
3.动态库文件编译的Makefile############################################# NAME: Makefile for creating static libs# AUTHOR: HAMMING# TIME: 2017-10-26# VERSION: V1.0# MODIFY:############################################ 1、准备工作,编译方式、目标文件名、依赖库路径的定义。CC = gccCFLAGS := -Wall -O3# opencv 头文件和lib路径 INC_CANGHAI = /home/canhai/libUsage/libLIB_CANGHAI = /home/canhai/libUsage/libSRCS := $(wildcard *.c)OBJS := $(patsubst %.c, %.o, $(SRCS)) #.o文件与.c文件同名LIB = libmath1.so # 目标文件名 OPENCV_INC= -I $(INC_CANGHAI)INCLUDE_PATH = $(OPENCV_INC)LIB_PATH = -L $(LIB_CANGHAI)# 依赖的lib名称OPENCV_LIB =all : $(LIB)# 2. 生成.o文件 %.o : %.c $(CC) $(CFLAGS) -fpic -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) # 3. 生成动态库文件$(LIB) : $(OBJS) rm -f $@ $(CC) -shared -o $@ $(OBJS) rm -f $(OBJS)tags : ctags -R *# 4. 删除中间过程生成的文件 clean: rm -f $(OBJS) $(TARGET) $(LIB)
C.动态库和静态库函数的调用
1.头文件(这里可以通过编译的时候指定头文件所在路径 -I $(PATH))
2.源文件main.c
#include "getSum.h"#include "getReduce.h"int main( int argc, char *argv[]){ int a = 0; int b = 0; int c = 0; c = getSum( a, b ); printf( "%d + %d = %d\n", a, b, c ); c = getReduce( a, b ); printf( "%d - %d = %d\n", a, b, c ); return 0;}
3.编译源程序使用的Makefile############################################# NAME: Makefile for Hello.cc# AUTHOR: HAMMING# TIME: 2017-10-26# VERSION: V1.0# MODIFY:###########################################GCC = gccCFLAGS = -g -WallINCLUDE:=/home/canhai/libUsage/libLIBS = $(wildcard /home/canhai/libUsage/lib/*.a)SRCS := $(wildcard *.c)TARGET := $(patsubst %.c, %, $(SRCS))OBJDIR = ..cc: $(CC) $(C_FLAGS) -o $@ $< -I $(INCLUDE) -lmath1 -lmath2 -L ../liball: $(TARGET) cleanclean: rm -rf *.o
D. 注意事项:
1、在测试过程中,经常会报错:找不到.so文件,或是头文件所在目录。一种简单的解决方法如下:
在linux终端输入如下命令:(永久有效需要配置到环境变量中)
Makefile中还要注意$@ $< 的顺序问题
只有动态库才需要在编译的时候进行链接-L $(PATH) -lmath2,静态库不需要
export LD_LIBRARY_PATH=~/libUsage/lib:LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/libUsage/lib:
E.参考资料点击打开链接
阅读全文
0 0
- C语言中动态库/静态库的创建和使用
- c语言------静态库和动态库的创建和使用
- c语言中静态库动态库的创建与使用
- Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux环境下c语言静态链接库和动态链接库创建和使用
- C中静态库和动态库的使用
- C语言程序静态库和动态库的创建及其应用
- C语言程序静态库和动态库的创建及其应用
- C语言程序静态库和动态库的创建及其应用
- C语言中静态库和动态库
- C语言中静态库的使用
- codeblocks创建和使用静态库(C语言)
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- linux下的C语言共享库和静态库的创建和使用
- C语言--动态库和静态库
- 在linux下,创建和使用C/C++的静态与动态库
- nifi初识---核心概念和整体架构
- shell脚本
- 如何查看和修改操作系统字符集
- opencv提取rgb
- fs模块基于async/await异步读写文件
- C语言中动态库/静态库的创建和使用
- Python入门3
- linux学习
- 极简主义︱利用apple机器学习平台Turicreate实现图像相似性检索(二)
- s3c2410 中断异常处理
- 特征检测和特征匹配方法
- Android——RxJava和RxAndroid
- element清空单个输入框
- 2的次幂表示