-
Linux 静态库动态库 Makefile 制作
2017-07-19 16:36:28静态库:使用静态库制作工具:ar rcs libname.a a.o b.o c.o 优点:将函数库中的函数本地化。寻址方便,速度快。 缺点:每个使用静态库的进程都要将库编译到可执行文件中加载到内存。内存消耗严重 动态库: 1 ...静态库:使用静态库制作工具:ar rcs libname.a a.o b.o c.o
优点:将函数库中的函数本地化。寻址方便,速度快。
缺点:每个使用静态库的进程都要将库编译到可执行文件中加载到内存。内存消耗严重
动态库:
1 生成“与位置无关”的目标文件gcc -fPIC a.c b.c c.c –c(参数 -fPIC 表示生成与位置无关代码)
2 使用gcc -shared选项:gcc -shared -o libname.so a.o b.o c.o
优点:多进程共享一份库文件,节省内存、易于更新
缺点:相较于静态库而言库函数访问略慢。静态库
SrcFiles = $(wildcard ./src/*.c)
ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))
path = -I./include
app1:libzjc.a
gcc main.c -o $@ $(path) -L ./ -l zjc
libzjc.a:$(ObjFiles)
ar -rcs $@ $(ObjFiles)
%.o:%.c
gcc -c $< $(path) -o $@
clean:
-@rm -f ./src/*.o
-@rm -f app1动态库
SrcFiles = $(wildcard ./src/*.c)
ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))
path = -I./include
app2:libzjc.so
gcc main.c -o $@ $(path) -L ./ -l zjc
libzjc.so:$(ObjFiles)
gcc -shared -o $@ $(ObjFiles)
%.o:%.c
gcc -c $< -fPIC $(path) -o $@
clean:
-@rm -f ./src/*.o
-@rm -f app2
-@rm -f libzjc.so找不到动态库.so的问题
第一种:
使用环境变量 LD_LIBRARY_PATH
○ 动态库的绝对路径添加到该环境变量中
○ LD_LIBRARY_PATH = /usr/include/xxx:$LD_LIBRARY_PATH
○ export LD_LIBRARY_PATH
直接在shell中 - 临时设置
写入配置文件
□ ~/.bashrc - 用户级别
□ /etc/prefile - 系统级别
第二种:
给动态库设置软连接 /usr/kevin/fastdfs
○ 将软链接放到 /usr/lib /usr/lib64 /lib /lib64
○ sudo ln -s /usr/kevin/fastdfs/xxx.so /usr/lib/libxxx.so
第三种:
刷新 /etc/ld.so.cache
首先 vi /etc/ld.so.conf
将动态库的绝对路径写入该文件中
sudo ldconfig -v -
linux编译动态库和静态库的makefile示例
2019-05-12 13:26:31根据GenDll.cpp文件,分别生成动态库.so和静态库....使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a) # 1、准备工作,编译方式、目标文件名、依赖库路径的定义。 CC = g++ CFLAGS := -Wall -O3 -s...根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。
1. 静态库的生成
makefile命令的简介可参考:跟我一起写 Makefile。使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a)
# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。
- CC = g++
- CFLAGS := -Wall -O3 -std=c++0x
- # opencv 头文件和lib路径
- OPENCV_INC_ROOT = /usr/local/include/opencv
- OPENCV_LIB_ROOT = /usr/local/lib
- OBJS = GenDll.o #.o文件与.cpp文件同名
- LIB = libgendll.a # 目标文件名
- OPENCV_INC= -I $(OPENCV_INC_ROOT)
- INCLUDE_PATH = $(OPENCV_INC)
- LIB_PATH = -L $(OPENCV_LIB_ROOT)
- # 依赖的lib名称
- OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc
- all : $(LIB)
- # 2. 生成.o文件
- %.o : %.cpp
- $(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB)
- # 3. 生成静态库文件
- $(LIB) : $(OBJS)
- rm -f $@
- ar cr $@ $(OBJS)
- rm -f $(OBJS)
- tags :
- ctags -R *
- # 4. 删除中间过程生成的文件
- clean:
- rm -f $(OBJS) $(TARGET) $(LIB)
2. 动态库的生成
第1、4步准备和收尾工作与静态库的保持一致,第2步和第3步所使用的命令稍有不同。
# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。
- CC = g++
- CFLAGS := -Wall -O3 -std=c++0x
- # opencv 头文件和lib路径
- OPENCV_INC_ROOT = /usr/local/include/opencv
- OPENCV_LIB_ROOT = /usr/local/lib
- OBJS = GenDll.o #.o文件与.cpp文件同名
- LIB = libgendll.so # 目标文件名
- OPENCV_INC= -I $(OPENCV_INC_ROOT)
- INCLUDE_PATH = $(OPENCV_INC)
- LIB_PATH = -L $(OPENCV_LIB_ROOT)
- # 依赖的lib名称
- OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc
- all : $(LIB)
- # 2. 生成.o文件
- %.o : %.cpp
- $(CC) $(CFLAGS) -fpic -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB)
- # 3. 生成动态库文件
- $(LIB) : $(OBJS)
- rm -f $@
- g++ -shared -o $@ $(OBJS)
- rm -f $(OBJS)
- tags :
- ctags -R *
- # 4. 删除中间过程生成的文件
- clean:
- rm -f $(OBJS) $(TARGET) $(LIB)
-fpic 和 -shared 命令可参考:Linux下动态库(.so)和静态库(.a)【注】这篇文章说可以使用ld命令生成.so文件,但我在测试时发会报错。
3. 动态库和静态库的调用
, 这两个的使用方法几乎没有区别。动态库的引用有显式和隐式两种,这里只说隐式调用。我使用main.cpp来测试生成的库文件, makefile如下:- CC = g++
- CFLAGS := -Wall -O3 -std=c++0x
- OPENCV_INC_ROOT = /usr/local/include/opencv
- OPENCV_LIB_ROOT = /usr/local/lib
- MY_ROOT = ../
- OPENCV_INC= -I $(OPENCV_INC_ROOT)
- MY_INC = -I $(MY_ROOT)
- EXT_INC = $(OPENCV_INC) $(MY_INC)
- OPENCV_LIB_PATH = -L $(OPENCV_LIB_ROOT)
- MY_LIB_PATH = -L $(MY_ROOT)
- EXT_LIB = $(OPENCV_LIB_PATH) $(MY_LIB_PATH)
- OPENCV_LIB_NAME = -lopencv_objdetect -lopencv_highgui -lopencv_imgproc -lopencv_core
- MY_LIB_NAME = -lgendll
- all:test
- test:main.cpp
- $(CC) $(CFLAGS) main.cpp $(EXT_INC) $(EXT_LIB) $(MY_LIB_NAME) $(OPENCV_LIB_NAME) -o test
-
4. 注意事项:
1、在测试过程中,经常会报错:找不到.so文件。一种简单的解决方法如下:
在linux终端输入如下命令:export LD_LIBRARY_PATH=/home/shaoxiaohu/lib:LD_LIBRARY_PATH:
更多解决方法可参考:Linux下gcc编译生成动态链接库*.so文件并调用它的第4部分。—–
makefile还需要学习,有很多细节还没有很明白。现在仍没有做到活学活用,应用仅限于套模板。
---------------------
作者:有来有去-CV
来源:CSDN
原文:https://blog.csdn.net/shaoxiaohu1/article/details/46943417
版权声明:本文为博主原创文章,转载请附上博文链接!
-
linux 生成和使用动态链接库和静态链接库的Makefile编写
2015-09-29 15:08:01介绍linux下生成和使用动态链接库和静态链接库的Makefile的编写方法。 2. 生成动态链接库的Makefile 首先要有一个c或c++等工具编写出来的库函数文件,也就是里面写了一堆可以被别的函数调用的函数。比如...生成和使用动态链接库和静态链接库的Makefile编写
1. 概述
介绍linux下生成和使用动态链接库和静态链接库的Makefile的编写方法。
2. 生成动态链接库的Makefile
首先要有一个c或c++等工具编写出来的库函数文件,也就是里面写了一堆可以被别的函数调用的函数。比如:
aaa.cpp
#include <stdio.h>
void pf1(void)
{
printf(“********\n”);
return;
}
void pf2(void)
{
printf(“#########\n”);
return;
}
接着要写编译这个函数的Makefile
要把一个文件编译成动态链接库文件需要分两个步骤
第一步:将这个文件编译成.o文件
CPP=c++
CPPFLAGS=-c
$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o
这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc
第二步:将这个.o文件链接成动态链接库文件
LD=ld
LIB = libaaa.so
$(LD) -shared -o $(LIB) haspapi.o
动态链接库文件的名字一定要以lib开头,后缀是.so
编译中一定要加上-shared,表示是生成动态链接库
3. 生成静态链接库
还是使用上面的文件,编写Makefile
同样也是分两步,第一步和上面一样,我直接拷贝过来
第一步:将这个文件编译成.o文件
CPP=c++
CPPFLAGS=-c
$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o
这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc
第二步:将这个.o文件链接成静态链接库文件
LIB = libaaa.a
AR=ar
(AR) -r $(LIB) aaa.o
静态链接库文件的后缀是.a,同样也是需要以lib开头
4. 链接库的使用
首先需要编写一个使用了链接库文件中函数的c或者c++文件
bbb.cpp
extern void pf1(void);
extern void pf2(void);
int main(void)
{
pf1();
pf2();
return 0;
}
使用链接库,Makefile文件如下:
$(CPP) bbb.cpp -I. -L. -o bbb.o -laaa
这里不分是动态的还是静态的,但是,如果使用动态链接库,运行时需要将aaa.so文件拷贝到/usr/lib下,静态库则不需要。
上面的例子是在redhat9上运行测试过的。
PS:由于对C++了解甚少,所以直接用c写得c++文件
-
linux编译动态库和静态库的makefile示例【转】
2018-05-31 23:41:09根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。 1. 静态库的生成 makefile命令的简介可参考:跟我一起写 ...使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(....(转自:https://blog.csdn.net/shaoxiaohu1/article/details/46943417)
根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。
1. 静态库的生成
makefile命令的简介可参考:跟我一起写 Makefile。使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a)
# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。 CC = g++ CFLAGS := -Wall -O3 -std=c++0x # opencv 头文件和lib路径 OPENCV_INC_ROOT = /usr/local/include/opencv OPENCV_LIB_ROOT = /usr/local/lib OBJS = GenDll.o #.o文件与.cpp文件同名 LIB = libgendll.a # 目标文件名 OPENCV_INC= -I $(OPENCV_INC_ROOT) INCLUDE_PATH = $(OPENCV_INC) LIB_PATH = -L $(OPENCV_LIB_ROOT) # 依赖的lib名称 OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc all : $(LIB) # 2. 生成.o文件 %.o : %.cpp $(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) # 3. 生成静态库文件 $(LIB) : $(OBJS) rm -f $@ ar cr $@ $(OBJS) rm -f $(OBJS) tags : ctags -R * # 4. 删除中间过程生成的文件 clean: rm -f $(OBJS) $(TARGET) $(LIB)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
2. 动态库的生成
第1、4步准备和收尾工作与静态库的保持一致,第2步和第3步所使用的命令稍有不同。
# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。 CC = g++ CFLAGS := -Wall -O3 -std=c++0x # opencv 头文件和lib路径 OPENCV_INC_ROOT = /usr/local/include/opencv OPENCV_LIB_ROOT = /usr/local/lib OBJS = GenDll.o #.o文件与.cpp文件同名 LIB = libgendll.so # 目标文件名 OPENCV_INC= -I $(OPENCV_INC_ROOT) INCLUDE_PATH = $(OPENCV_INC) LIB_PATH = -L $(OPENCV_LIB_ROOT) # 依赖的lib名称 OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc all : $(LIB) # 2. 生成.o文件 %.o : %.cpp $(CC) $(CFLAGS) -fpic -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) # 3. 生成动态库文件 $(LIB) : $(OBJS) rm -f $@ g++ -shared -o $@ $(OBJS) rm -f $(OBJS) tags : ctags -R * # 4. 删除中间过程生成的文件 clean: rm -f $(OBJS) $(TARGET) $(LIB)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
-fpic 和 -shared 命令可参考:Linux下动态库(.so)和静态库(.a)【注】这篇文章说可以使用ld命令生成.so文件,但我在测试时发会报错。
3. 动态库和静态库的调用
, 这两个的使用方法几乎没有区别。动态库的引用有显式和隐式两种,这里只说隐式调用。我使用main.cpp来测试生成的库文件, makefile如下:
CC = g++ CFLAGS := -Wall -O3 -std=c++0x OPENCV_INC_ROOT = /usr/local/include/opencv OPENCV_LIB_ROOT = /usr/local/lib MY_ROOT = ../ OPENCV_INC= -I $(OPENCV_INC_ROOT) MY_INC = -I $(MY_ROOT) EXT_INC = $(OPENCV_INC) $(MY_INC) OPENCV_LIB_PATH = -L $(OPENCV_LIB_ROOT) MY_LIB_PATH = -L $(MY_ROOT) EXT_LIB = $(OPENCV_LIB_PATH) $(MY_LIB_PATH) OPENCV_LIB_NAME = -lopencv_objdetect -lopencv_highgui -lopencv_imgproc -lopencv_core MY_LIB_NAME = -lgendll all:test test:main.cpp $(CC) $(CFLAGS) main.cpp $(EXT_INC) $(EXT_LIB) $(MY_LIB_NAME) $(OPENCV_LIB_NAME) -o test
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
4. 注意事项:
1、在测试过程中,经常会报错:找不到.so文件。一种简单的解决方法如下:
在linux终端输入如下命令:export LD_LIBRARY_PATH=/home/shaoxiaohu/lib:LD_LIBRARY_PATH:
- 1
更多解决方法可参考:Linux下gcc编译生成动态链接库*.so文件并调用它的第4部分。
—–
makefile还需要学习,有很多细节还没有很明白。现在仍没有做到活学活用,应用仅限于套模板。
-
linux静态库生成demo工程
2019-02-20 09:16:12生成Linux静态库的工程模板,只要在Makefile 文件中添加工程中源文件头文件的路径,就可以生成Linux静态库。这里是demo工程。 -
linux下静态库、动态库编译及makefile书写
2016-09-19 13:44:51库文件源码为:app.c使用库文件源码为:main.c静态链接库生成:gcc -c app.car rcs libtest.a app.o静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们要生成名为test的静态库,则静态... -
linux使用autotools生成可执行文件、静态库、动态库Makefile的流程介绍
2014-09-24 11:07:41Linux下,工程管理器make是可用于自动编译、链接程序的实用工具。我们要做的是写一个Makefile... GNU autotools作用:收集系统配置信息并自动生成Makefile文件。 GNU autotools主要包括三个工具:autoconf、automa -
常用的一个简单生成静态库的makefile
2007-06-19 15:16:00#=============================================# Makefile (linux) for S21SDK Sample : testnc#=============================================SHELL = /bin/shCC = mipsel-linux-gccAR = mipsel-linux-arC -
常用的一个简单生成静态库的makefile
2007-06-18 14:22:00#=============================================# Makefile (linux) for S21SDK Sample : testnc#=============================================SHELL = /bin/shCC = mipsel-linux-gccAR = mipsel-linux-arC -
Linux 静态库生成及调用
2020-11-27 15:46:43文章目录1 编写源文件及makefile,生成静态库2 编写接口文件(xx.h)3 链接动态库生成可执行文件4 执行(无需指定动态库位置)在嵌入式linux中使用动态库(拿移远CEFI举例) 静态库 Static library 静态库是obj文件... -
Linux下用Makefile制作动态库和静态库并编译生成可执行程序
2018-01-19 21:31:14Makefile 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,...在 Linux(unix )环境下使用GNU 的make工具能够比较容易的构建一个属 -
linux下的静态库与动态库的区别,Gdb调试段错误,自动生成Makefile
2012-07-12 12:49:03linux下的静态库与动态库的区别 1.什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的本质不同,因此二者库... -
Linux下Makefile中动态链接库和静态链接库的生成与调用
2017-06-15 20:14:49背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译、链接、生成可执行文件,从而实现了移植的过程。平台是Toradex的Apalis TK1,三千多元,买回来我就... -
linux下静态库和动态库的通用生成模板
2018-06-03 00:43:37Makefile文件的编写 ################################################################ #自动将src目录下所有的cpp、cc和c文件编译,生成所有.o文件保存在bin/obj下 #...
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
洛谷P1720 月落乌啼算钱(斐波那契数列)经典解法
-
python—删除链表中倒数第K个元素
-
学业辅导-递归
-
Pytorch问题---The size of tensor a (4) must match the size of tensor b (3) at non-singletonThe size of
-
C++学习(二一七)有关Nsight Tegra
-
搭建docker私有库的具体方法
-
2012年下半年 嵌入式系统设计师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
2019年下半年 软件评测师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
关于绝热演化的一般模型
-
linux基础入门和项目实战部署系列课程
-
python—把链表的相邻元素翻转
-
朱老师c++课程第3部分-3.5STL的其他容器讲解
-
射影级双缝光子晶体光机腔设计
-
AttributeError: ‘PyQt5.QtCore.pyqtSignal‘ object has no attribute ‘connect‘
-
Unity 热更新技术-ILRuntime
-
Kubernetes下日志采集、存储与处理技术实践
-
java数独题库高效生成算法代码
-
ApacheFlink漫谈系列-概述
-
springcloud-gateway源码-(六)全流程处理导图