0%

opencv-build-zlib

OpenCV - Build_ZLIB

在编译OpenCV需要链接到第三方库,OpenCV已经为我们准备并放置在3rdparty下。

这里比较特殊的是BUILD_ZLIB,在Windows下,如何设置BUILD_ZLIB为false,在编译时,依然
会编译并使用3rdparty下的zlib,发生这种现象的原因是下面的一段cmake,
位于cmake/OpenCvFindLibsGrfmt.cmake中。

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
# --- zlib (required) ---
if(BUILD_ZLIB)
ocv_clear_vars(ZLIB_FOUND)
else()
ocv_clear_internal_cache_vars(ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
if(ANDROID)
set(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_SUFFIXES .so)
endif()
find_package(ZLIB "${MIN_VER_ZLIB}")
if(ANDROID)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
unset(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
endif()
if(ZLIB_FOUND AND ANDROID)
if(ZLIB_LIBRARIES MATCHES "/usr/lib.*/libz.so$")
set(ZLIB_LIBRARIES z)
endif()
endif()
endif()

if(NOT ZLIB_FOUND)
ocv_clear_vars(ZLIB_LIBRARY ZLIB_LIBRARIES ZLIB_INCLUDE_DIR)

set(ZLIB_LIBRARY zlib CACHE INTERNAL "")
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/zlib")
set(ZLIB_INCLUDE_DIR "${${ZLIB_LIBRARY}_SOURCE_DIR}" "${${ZLIB_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})

ocv_parse_header2(ZLIB "${${ZLIB_LIBRARY}_SOURCE_DIR}/zlib.h" ZLIB_VERSION)
endif()

从上面的cmake片段我们可以知道,zlib在OpenCV的编译中是必须的,默认,BUILD_ZLIB设置
为true,这时,ZLIB_FOUND会被清理,总是会进入第二个if(NOT ZLIB_FOUND) add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/zlib")。如果将BUILD_ZLIB
设置为false,则会先进入第一个if(BUILD_ZLIB)的else中,尝试通过find_package(ZLIB "${MIN_VER_ZLIB}")
查找系统中的zlib(这也是为什么在MacOS中设置BUILD_ZLIB=false会起作用,因为zlib已经
成为MacOS的一部分)