根据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
版权声明:本文为博主原创文章,转载请附上博文链接!