0%

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的一部分)

CMake Note

这是一个我个人在使用CMake时记录的笔记。

FUNCTION vs MACRO

ARGC ARGV ARGN

  • ARGC
  • ARGV
  • ARGN

include

add_subdirectory

创建新的工作域,并继承调用add_subdirectory的工作域。

CMAKE_PREFIX_PATH

find_package

Modules

FindPackageHandleStandardArgs

CMake 属性

  • MSVC_RUNTIME_LIBRARY

    这里主要涉及到的是MSVC下的运行时库链接问题,分为动态链接与静态链接,在默认情况都是才是动态链接的形式链接
    到运行时库。

    使用该属性的核心是保证每一个依赖项的运行时库相同,官网已经为我们提供了简单直观的实例。

1
2
3
4
5
6
add_executable(foo foo.c)
# MultiThreaded表示需要使用静态链接,但是注意,在Debug与Release下是链接到不同的库,
# 所以这里使用了cmake-generator-expressions,在Debug模式时实际生成MultiThreadedDebug(MTd),
# 其他则是MultiThreaded(/MT)
set_property(TARGET foo PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  • VS_DEBUGGER_ENVIRONMENT

    为Visual Studio C++设置debug环境,这里比较直观的例子是当执行文件与依赖项不在
    同一个目录下时,执行文件会因为无法获取依赖项而导致失败。这里涉及到Windows下的环境
    变量PATH,依赖项不在PATH下,无法被执行文件发现,通过设置VS_DEBUGGER_ENVIRONMENT
    可以添加额外的环境路径

项目顶级目录下的子目录创建

在Visual Studio等IDE进行开发时,用户可以创建虚拟的目录用于管理项目,这里CMake通过USE_FOLDERS属性可以开启
该功能,使用FOLDER可以给target这是目录。这里,全局属性USE_FOLDERS必须被设置为ON。

1
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

通过为target设置目录。

1
set_target_properties(<target_name> PROPERTIES FOLDER <dir for target>)

额外,CMake会产生一些自动的target,如INSTALLALL_BUILD,这些被成为预定义目标,
则需要通过设置属性PREDEFINED_TARGETS_FOLDER

1
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")

在Apple下链接framework

target_link_libraries(lib_name “-framework “”)

在Apple下c++ -framework framework_name

例子

if(APPLE)
target_link_libraries(lib_name “-framework CoreFoundation””)
endif

Nginx配置目录

请不要将所有配置写入/etc/nginx/nginx.conf中。

首先,这篇文章是为了解决一个对初次接触nginx的运维人员常会出现的不太好的习惯:
总是将配置文件写入nginx.conf中。

首先,为什么新手会将所有配置写入nginx.conf,因为如果没有其他人的引导,在网上搜索资料时,给出的答案基本都会是直接的配置文件修改,但一般不会提到在哪里,为什么修改这个文件。

sites-available与sites-enabled (Ubuntu下的nginx默认生成)

给出使用方法:

在sites-available中存放实际的配置文件(不需要.conf后缀),同时将需要激活的配置文件软链接到sites-enabled下。

说明:

sites-available添加配置,sites-enabled激活配置。

/etc/nginx目录下有两个子目录,分别是sites-availablesites-enabled,默认在sites-available中有一个默认的配置文件default,同时,在sites-enabled存放了这个default配置文件的软链接。

通过查看nginx.conf,可以找到下面一个配置:

include /etc/nginx/sites-enabled/*;

将在sites-enabled中所有的配置文件导入,所以,当需要配置站点时,可以在sites-enabled下为每一个站点添加单独的配置文件,但是,不建议直接在sites-enabled下直接创建配置文件,通用方法时,在sites-available创建配置文件(sites-available下的配置文件默认不会被应用),然后,将需要激活的配置软链接到sites-enabled,这样,即增加了配置的灵活性,同时可以保留配置文件。

snippets/snakeoil.conf (Ubuntu下的nginx默认生成)

主要用于证书存放

建议在snippets下创建一个与域名同名的配置文件,如为域名domain.comsnippets创建一个domain.com.conf配置文件用于指向证书与密钥,然后在域名的配置文件下添加配置include snippets/domain.com.conf;

扩展

证书颁发

Babel - 兼容性转换

CommonJS and ES module

V8 - Javascirpt engine

V8提供一个Javascript运行时环境

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment