cmake检测编译环境

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夜班车,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *