[8] CMake总结 - 5 FIND_ & FindNAME.cmake
来源:互联网 发布:制作纪录片的软件 编辑:程序博客网 时间:2024/06/06 10:41
本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式
FIND_指令
- FIND_FILE(<VAR> name path1 path2 …)
VAR变量代表找到的文件全路径,包含文件名 - FIND_LIBRARY(<VAR> name path1 path2 …)
VAR变量代表找到的库全路径,包含库文件名 - FIND_PATH(<VAR> name path1 path2 …)
VAR变量代表包含这个文件的路径 - FIND_PROGRAM(<VAR> name path1 path2 …)
VAR变量代表包含这个程序的全路径 FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE] [[REQUIRED | COMPONENTS] [componets …]])
用来调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块,你也可以自己定义Find<name>
模块,通过SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录供工程使用FIND_LIBRARY(libX X11 /usr/lib)IF (NOT libx) MESSAGE(FATAL_ERROR "libX not found")ENDIF(NOT libX)
module
使用cmake本身提供的基本指令来管理复杂工程是一件复杂的事情,所以,cmake设计成了可扩展的架构,可以通过编写一些通用的模块来扩展cmake.
系统预定义的Find模块的使用,系统中提供了其他各种模块,一般情况需要使用INCLUDE指令显式的调用, FIND_PACKAGE指令是一个特例,可以直接调用预定义的模块。
#对于系统预定义的Find<name>.cmake模块,使用方法一般如下所示:FIND_PACKAGE(NAME)IF(NAME_FOUND) INCLUDE_DIRECTORIES(${NAME_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(targetname ${NAME_LIBRARY})ELSE(NAME_FOUND) MESSAGE(FATAL_ERROR ”NAME library not found”)ENDIF(NAME_FOUND)
每一个模块都会定义以下3个变量
<name>_FOUND<name>_INCLUDE_DIR or <name>_INCLUDES<name>_LIBRARY or <name>_LIBRARIES
你可以通过<name>_FOUND来判断模块是否被找到,如果没有找到,按照工程的需要关闭某些特性、给出提醒或者中止编译,上面的例子就是报出致命错误并终止构建。
如果<name>_FOUND为真
则将<name>_INCLUDE_DIR加入INCLUDE_DIRECTORIES,
将<name>_LIBRARY加入TARGET_LINK_LIBRARIES中。
#我们再来看一个复杂的例子,通过<name>_FOUND来控制工程特性:SET(mySources viewer.c)SET(optionalSources)SET(optionalLibs)FIND_PACKAGE(JPEG)IF(JPEG_FOUND) SET(optionalSources ${optionalSources} jpegview.c) INCLUDE_DIRECTORIES( ${JPEG_INCLUDE_DIR} ) SET(optionalLibs ${optionalLibs} ${JPEG_LIBRARIES} ) ADD_DEFINITIONS(-DENABLE_JPEG_SUPPORT)ENDIF(JPEG_FOUND)IF(PNG_FOUND) SET(optionalSources ${optionalSources} pngview.c) INCLUDE_DIRECTORIES( ${PNG_INCLUDE_DIR} ) SET(optionalLibs ${optionalLibs} ${PNG_LIBRARIES} ) ADD_DEFINITIONS(-DENABLE_PNG_SUPPORT)ENDIF(PNG_FOUND)ADD_EXECUTABLE(viewer ${mySources} ${optionalSources} )TARGET_LINK_LIBRARIES(viewer ${optionalLibs})#通过判断系统是否提供了JPEG库来决定程序是否支持JPEG功能。
自己编写的Find模块
基于我们前面的libhello共享库,编写一个FindHello.cmake模块。
FIND_PATH(HELLO_INCLUDE_DIR hello.h <绝对路径>)FIND_LIBRARY(HELLO_LIBRARY NAMES hello <绝对路径>)#可以直接写libhello.so or libhello.aIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) SET(HELLO_FOUND TRUE)ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)IF (HELLO_FOUND) IF (NOT HELLO_FIND_QUIETLY) MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}") ENDIF (NOT HELLO_FIND_QUIETLY)ELSE (HELLO_FOUND) IF (HELLO_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find hello library") ENDIF (HELLO_FIND_REQUIRED)ENDIF (HELLO_FOUND)
前面的NAME例子中我们使用了最简单的FIND_PACKAGE指令,其实他可以使用多种参数,QUIET参数,对应与我们编写的FindHELLO中的HELLO_FIND_QUIETLY,如果不指定这个参数,就会执行:
MESSAGE(STATUS “Found Hello: ${HELLO_LIBRARY}”)
REQUIRED参数,其含义是指这个共享库是否是工程必须的,如果使用了这个参数,说明这个链接库是必备库,如果找不到这个链接库,则工程不能编译。对应于FindHELLO.cmake模块中的HELLO_FIND_REQUIRED变量。同样,我们在上面的模块中定义了HELLO_FOUND,HELLO_INCLUDE_DIR,HELLO_LIBRARY变量供开发者在FIND_PACKAGE指令中使用。
下面建立src/main.cpp,内容为:
#include <hello.h>int main(){ HelloFunc(); return 0;}
建立src/CMakeLists.txt文件,内容如下:
FIND_PACKAGE(HELLO)IF(HELLO_FOUND) ADD_EXECUTABLE(hi main.cpp) INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR}) MESSAGE(STATUS "LINK " ${HELLO_LIBRARY}) TARGET_LINK_LIBRARIES(hi ${HELLO_LIBRARY})ELSE(HELLO_FOUND) MESSAGE(STATUS "Could not find hello library")ENDIF(HELLO_FOUND)
为了能够让工程找到FindHELLO.cmake模块(存放在工程中的cmake目录)我们在主工程文件CMakeLists.txt中加入:
PROJECT(MODULE)CMAKE_MINIMUM_REQUIRED(VERSION 2.8)SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/")MESSAGE(STATUS "CMAKE_MODULE_PATH " ${PROJECT_SOURCE_DIR}/cmake)ADD_SUBDIRECTORY(src)
- [8] CMake总结 - 5 FIND_ & FindNAME.cmake
- cmake 总结
- Cmake总结
- CMake总结
- cmake
- cMAKE
- cmake
- CMake
- Cmake
- cmake
- cmake
- CMake
- cmake
- CMake
- CMake
- CMake
- cmake
- CMAKE
- HDU 1147 Pick-up sticks (叉乘判断线段相交)
- HttpServletRequest,HttpSession和ServletContext的异同
- 获取通信录(使用第三方框架RHAddressBook)
- android如何根据一个String来级联ListView
- dp之状态和状态转移 2
- [8] CMake总结 - 5 FIND_ & FindNAME.cmake
- 中国低技术制造业的衰落中高端制造业的兴起
- B/S总结--前台攻略--JS:function
- POJ 3498 March of the Penguins(枚举+最大流)
- [Python 与 炒股] TuShare 使用篇之三
- 保存图片到sd卡指定的(创建)文件夹
- leetcode242题 题解 翻译 C语言版 Python版
- linux4.3.2 块设备驱动简析-2
- Codeforces Round #342 (Div. 2)--C. K-special Tables