根据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还需要学习,有很多细节还没有很明白。现在仍没有做到活学活用,应用仅限于套模板。