首页 / 资讯中心 / 文章详情

【工程与环境】OpenCV: 调用OpenCV动态库与静态库的书写方式(Makefile)

【工程与环境】OpenCV: 调用OpenCV动态库与静态库的书写方式(Makefile) ★ FEATURED ARTICLE
下方makefile的书写针对的是Opencv2.4.9.1版本的动态库调用、OpenCV3.3.0动态库调用和OpenCV3.4.1的静态库调用别问为啥感觉都是泪其实做研发、工程、产线这个当中存在很多问题例如最简单的就是使用版本不一致的问题这个很耗时耗力。举个例子LZ安装的都是Tensorflow1.14版本公司写的接口全部是1.13版本的就会出现LZ训练好了模型因为tf的版本不一致而可能导致两个问题1.LZ需要使用tf1.13版本重新训练2.后端需要开发tf1.14版本对应接口其实在一开始就沟通好或者固定好感觉这样会更加有效一些对于opencv更是如此接口与接口的差距还挺大的版本也有很多如果研发、后端、产线每个使用的都是不同的版本在实际应用当中仅仅是版本冲突不匹配就会出现各种各样的问题。好了下面进入正题在实际使用的时候为了保护源代码的安全经常会将代码封装成动态库.so格式或者静态库.a格式然后只要直接调用对应接口就行了LZ也要把自己写的代码封装一下平时在自己的小笔记本上跑惯了基本上不需要生成对应的动态库静态库但现在不一样所以还是需要生成对应库的。下面主要是LZ使用的OpenCV是自己文件下的而不是以前使用的系统环境中的OpenCV所以还是摸索了一阵。1. 对OpenCV2.4.9.1版本的动态库链接代码#获取工程的根目录的全路径 SOURCE_ROOT $(shell pwd) SOURCE main.cpp OBJS test.o TARGET test # compile and lib parameter CC g # 对应需要链接的库 LIBS -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_videostab -lopencv_ml -lopencv_objdetect LIBS -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc LIBS -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_video LIBS -ldc1394 -lraw1394 -lm # 包含对应的文件的路径 LDFLAGS -L$(SOURCE_ROOT)/lib -L$(SOURCE_ROOT)/lib/opencv INCLUDE : -I $(SOURCE_ROOT)/include -I $(SOURCE_ROOT)/interface INCLUDE -I $(SOURCE_ROOT)/ -I $(SOURCE_ROOT)/inc -I $(SOURCE_ROOT)/inc/opencv CFLAGS -Wall -O -fPIC CXXFLAGS -stdgnu11 all: $(TARGET) # link $(TARGET):$(OBJS) $(CC) -o $ $^ $(LDFLAGS) $(LIBS) $(STATIC_LIBS) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) #compile $(OBJS):$(SOURCE) $(CC) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) -o $ -c $^ # clean clean: rm -fr *.o rm -fr $(TARGET)2. 对OpenCV3.3.0版本的动态库链接代码SOURCE main.cpp OBJS test.o TARGET test OBJS_DEBUG test_debug.o TARGET_DEBUG test_debug # compile and lib parameter CC g LIBS -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_videostab -lopencv_ml -lopencv_objdetect LIBS -lopencv_dnn -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgcodecs LIBS -lopencv_photo -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_video -lopencv_videoio LIBS -ldc1394 -lraw1394 -lm -ldl #STATIC_LIBS LDFLAGS -L./lib -L./lib/opencv LDFLAGS -L../boost/stage/lib -pthread INCLUDE -I ./ -I ./inc -I ./inc/opencv -I ./ CFLAGS -Wall -O -fPIC CXXFLAGS -stdgnu11 all: $(TARGET) $(TARGET_DEBUG) # link $(TARGET):$(OBJS) $(CC) -o $ $^ $(LDFLAGS) $(LIBS) $(STATIC_LIBS) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) $(TARGET_DEBUG):$(OBJS_DEBUG) $(CC) -o $ $^ $(LDFLAGS) $(LIBS) $(STATIC_LIBS) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) -g #compile $(OBJS):$(SOURCE) $(CC) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) -o $ -c $^ $(OBJS_DEBUG):$(SOURCE) $(CC) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) -g -o $ -c $^ # clean clean: rm -fr *.o rm -fr $(TARGET) $(TARGET_DEBUG) ~3. 对OpenCV3.4.1版本的静态库链接代码SOURCE main.cpp OBJS test.o TARGET test # compile and lib parameter CC g LIBS -lopencv_highgui -lopencv_imgcodecs -lopencv_calib3d -lopencv_imgproc -lopencv_flann -lopencv_core LIBS -lcairo -lgtk-3 -lgdk_pixbuf-2.0 -lgobject-2.0 -lzlib LIBS -llibjasper -lIlmImf -lippiw -llibjpeg -llibpng -llibtiff -lippicv -llibwebp -littnotify -lz LIBS -ldc1394 -lraw1394 -lm -ldl #STATIC_LIBS LDFLAGS -L./lib -L./lib/opencvLib LDFLAGS -L../boost/stage/lib -pthread INCLUDE -I ./ -I ./inc -I ./inc/opencv -I ./ CFLAGS -Wall -O -fPIC CXXFLAGS -stdgnu11 all: $(TARGET) $(TARGET_DEBUG) # link $(TARGET):$(OBJS) $(CC) -o $ $^ $(LDFLAGS) $(LIBS) $(STATIC_LIBS) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) #compile $(OBJS):$(SOURCE) $(CC) $(CFLAGS) $(INCLUDE) $(CXXFLAGS) -o $ -c $^ # clean clean: rm -fr *.o rm -fr $(TARGET) $(TARGET_DEBUG)注意几个问题OpenCV3.4.1是业务给我的静态库结果LZ一直编译不出来结果发现他少给了LZ一个库结果LZ各种百度哭死。。。OpenCV还会依赖部分第三方库在编译的时候在opencv3-4.1/build/3rdparty/lib文件夹下,这些静态库都要一起放到opencv的lib下libippiw.a libittnotify.a liblibjasper.a liblibjpeg.a liblibprotobuf.a liblibwebp.a libzlib.a下面是LZ折腾了一下午的问题./lib/opencvLib/liblibpng.a(pngrutil.c.o): In function png_inflate_claim: pngrutil.c:(.text.png_inflate_claim0x176): undefined reference to inflateValidate ./lib/opencvLib/liblibpng.a(pngrutil.c.o): In function png_decompress_chunk.constprop.4: pngrutil.c:(.text.png_decompress_chunk.constprop.40x267): undefined reference to inflateValidate collect2: error: ld returned 1 exit status make: *** [test] Error 1结果各种百度都是无法解决最后发现业务少给了一个libzlib.a的库浪费了大半天时间。。。百度、google大多数给出都是版本不匹配的问题要重新下载zlib然后进行编译LZ总感觉不是这个问题最后找到缺库的问题库与库之间是存在先后顺序的之前出现各种库找不到undefined reference:之类的就是链接库的顺序不对链接库的时候还要注意权限问题有些时候链接不上库是没给到权限
阅读完成 · 觉得有帮助?
咨询建站