cmake检测编译环境
cmake检测编译环境就是检测当前编译工程的环境是否满足工程的需要,这包括
1. 编译器的版本,如gcc
2. cmake的版本
3. 需要的一些库
前两者不在这里叙述,比较简单,这里说说如何检测第三个。检测第三个有3个方法,
a)使用find_package
b)使用check_include_file
c)使用check_function_exists
比较推荐第一个,因为但凡我们要找的库都是通用库,如果是私有的库的一般都会在工程中自带,如果不是,后面会说怎么自定义find_package。既然是通用库,那么很多人都会遇到同样的问题,或者需求,那么网络上就有人已经贡献了查找这个package的脚本,其实就是一个cmake的脚本文件,比如说找apache的运行时库,apr,那么直接在google中搜索
find package apr cmake
那么就可以找到对应的cmake文件,直接复制粘帖,然后放在工程根目录下面的modules(如果没有创建一个),或者在顶级CMakeLists.txt文件指定放置modules目录,
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
这里就是指定modules的路径为2个,默认的modules和 cmake/modules
如果从网上找不到对应的cmake文件,那么自己写一个也不难,这里有个例子是查找zlib的
###############################################
# – Try to find libzip
# Once done this will define
#
# LIBZIP_FOUND – system has the zip library
# LIBZIP_INCLUDE_DIR – the zip include directory
# LIBZIP_LIBRARY – Link this to use the zip library
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if (LIBZIP_LIBRARY AND LIBZIP_INCLUDE_DIR)
# in cache already
set(LIBZIP_FOUND TRUE)
else (LIBZIP_LIBRARY AND LIBZIP_INCLUDE_DIR)
find_path(LIBZIP_INCLUDE_DIR zip.h
${GNUWIN32_DIR}/include
)
find_library(LIBZIP_LIBRARY NAMES zip
PATHS
${GNUWIN32_DIR}/lib
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibZip DEFAULT_MSG LIBZIP_LIBRARY LIBZIP_INCLUDE_DIR)
# ensure that they are cached
set(LIBZIP_INCLUDE_DIR ${LIBZIP_INCLUDE_DIR} CACHE INTERNAL "The libzip include path")
set(LIBZIP_LIBRARY ${LIBZIP_LIBRARY} CACHE INTERNAL "The libraries needed to use libzip")
endif (LIBZIP_LIBRARY AND LIBZIP_INCLUDE_DIR)
mark_as_advanced(LIBZIP_INCLUDE_DIR LIBZIP_LIBRARY)
###########################################################
第二个方法使用check_include_file,相对来说也比较简单,但是这个只是查找头文件,比如查找apr的头文件,
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} #设置要查找的路径
INCLUDE (CheckIncludeFileCXX) # 包含CHECK_INCLUDE_FILE_CXX这个宏的文件定义,CXX是c++的,如果是C则使用CheckIncludeFile
CHECK_INCLUDE_FILE_CXX ("apr-1/apr.h" HAVE_APR_H) #查找,这里CXX是c++的,如果使用c则使用CHECK_INCLUDE_FILE
然后检测是否找到,如果找到HAVE_APR_H就是1
18 if( HAVE_APR_H )
19 message( STATUS "apr-devel found" )
20 else()
21 message( FATAL_ERROR "apr-devel header is needed, please install it by issue command: sudo yum install -y apr-devel" )
22 endif()
第三个方法check_function_exists,
include (CheckFunctionExists)
check_function_exists (strlen HAVE_STRLEN)
然后也是检测变量。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.