抚顺市+网站建设,设计公司的企业文化内容,163免费注册入口,全国做网站的大公司CMake模块的使用和自定义模块一、前言二、使用Find模块2.1、准备工作2.2、添加头文件路径和库文件2.3、 name _FOUND 来控制工程特性三、编写自定义的Find模块3.1、 准备工作3.2、cmake 模块3.3、使用自定义的FindHELLO 模块构建工程3.4、如果没有找到hello library四、…
CMake模块的使用和自定义模块一、前言二、使用Find模块2.1、准备工作2.2、添加头文件路径和库文件2.3、 name _FOUND 来控制工程特性三、编写自定义的Find模块3.1、 准备工作3.2、cmake 模块3.3、使用自定义的FindHELLO 模块构建工程3.4、如果没有找到hello library四、总结一、前言
本文将着重介绍系统预定义的Find 模块的使用以及自己编写Find 模块系统中提供了其他各种模块一般情况需要使用INCLUDE 指令显式的调用FIND_PACKAGE 指令是一个特例可以直接调用预定义的模块。
其实使用纯粹依靠cmake 本身提供的基本指令来管理工程是一件非常复杂的事情所以 cmake 设计成了可扩展的架构可以通过编写一些通用的模块来扩展cmake.
本文首先介绍一下cmake 提供的 FindCURL 模块的使用。然后基于共享库编写一个FindHello.cmake 模块。
二、使用Find模块
FIND_PACKAGE 指令
FIND_PACKAGE(name [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])可以使用多种参数QUIET 参数REQUIRED 参数其含义是指这个共享库是否是工程必须的如果使用了这个参数说明这个链接库是必备库如果找不到这个链接库则工程不能编译。
2.1、准备工作
1建立 t5 目录用于存放我们的CURL 的例子。
mkdir t52建立src 目录并建立src/main.c
cd t5
mkdir src
cd src
vim main.c内容如下
#include curl/curl.h
#include stdio.h
#include stdlib.h
#include unistd.h
FILE *fp NULL;
int write_data(void *ptr, size_t size, size_t nmemb, void *stream) {int written fwrite(ptr, size, nmemb, (FILE *)fp);return written;
}
int main(void) {const char * path /tmp/curl-test;const char * mode w;fp fopen(path, mode);curl_global_init(CURL_GLOBAL_ALL);CURL *curl curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, http://www.baidu.com);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);CURLcode res curl_easy_perform(curl);curl_easy_cleanup(curl);return 0;
}这段代码的作用是通过curl 取回http://www.linux-ren.org 的首页并写入/tmp/curl-test文件中。
3建立主工程文件CMakeLists.txt。
cd t5
vim CMakeLists.txt内容如下
PROJECT(CURLTEST)
ADD_SUBDIRECTORY(src)4建立src/CMakeLists.txt内容如下
ADD_EXECUTABLE(curltest main.c)现在自然是没办法编译的我们需要添加 curl 的头文件路径和库文件。
2.2、添加头文件路径和库文件
1方法1
直接通过INCLUDE_DIRECTORIES 和TARGET_LINK_LIBRARIES 指令添加我们可以直接在src/CMakeLists.txt 中添加
INCLUDE_DIRECTORIES(/usr/include)
TARGET_LINK_LIBRARIES(curltest curl)然后建立build 目录进行外部构建即可。
2方法2使用FindCURL 模块。
现在是使用cmake 提供的 FindCURL 模块向 src/CMakeLists.txt 中添加
FIND_PACKAGE(CURL)
IF(CURL_FOUND)
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY})
ELSE(CURL_FOUND)
MESSAGE(FATAL_ERROR ”CURL library not found”)
ENDIF(CURL_FOUND)对于系统预定义的Find.cmake 模块使用方法一般如上例所示。每一个模块都会定义以下几个变量
name_FOUND
name_INCLUDE_DIR or name_INCLUDES
name_LIBRARY or name_LIBRARIES可以通过_FOUND 来判断模块是否被找到如果没有找到按照工程的需要关闭某些特性、给出提醒或者中止编译上面的例子就是报出致命错误并终止构建。
如果 name_FOUND 为真则将 name_INCLUDE_DIR 加入INCLUDE_DIRECTORIES将 name _LIBRARY 加入 TARGET_LINK_LIBRARIES 中。
然后建立build 目录进行外部构建
mkdir build
cd build
cmake ..如果库不存在则会报错【CMake Error at src/CMakeLists.txt:7 (MESSAGE): CURL library not found】
-- The C compiler identification is GNU 8.4.0
-- The CXX compiler identification is GNU 8.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)
CMake Error at src/CMakeLists.txt:7 (MESSAGE):CURL library not foundCMake Warning (dev) in CMakeLists.txt:No cmake_minimum_required command is present. A line of code such ascmake_minimum_required(VERSION 3.21)should be added at the top of the file. The version specified may be lowerif you wish to support older CMake versions for this project. For moreinformation run cmake --help-policy CMP0000.
This warning is for project developers. Use -Wno-dev to suppress it.-- Configuring incomplete, errors occurred!
See also /home/fly/workspace/cmakeProj/t5/build/CMakeFiles/CMakeOutput.log.2.3、 name _FOUND 来控制工程特性
再来看一个复杂的例子通过_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模块
3.1、 准备工作
编写属于自己的FindHello 模块。
1建立cmake/中建立t6 目录并在其中建立cmake 目录用于存放我们自己定义的FindHELLO.cmake 模块。同时建立src 目录用于存放我们的源文件。
mkdir t6
cd t6
mkdir cmake
mkdir src2定义 cmake/FindHELLO.cmake 模块。
FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATH /usr/lib /usr/local/lib)IF (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)可以使用多种参数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 指令中使用。
3.2、cmake 模块
hello的库使用之前文章介绍的示例。
下面建立src/main.c内容为
#include hello.h
int main()
{HelloFunc();return 0;
} 建立src/CMakeLists.txt 文件内容如下
FIND_PACKAGE(HELLO)
IF(HELLO_FOUND)
ADD_EXECUTABLE(hello main.c)
INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY})
ENDIF(HELLO_FOUND)为了能够让工程找到FindHELLO.cmake 模块(存放在工程中的 cmake 目录)我们在主工程文件CMakeLists.txt 中加入
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)3.3、使用自定义的FindHELLO 模块构建工程
仍然采用外部编译的方式建立build 目录进入目录运行
mkdir build
cd build
cmake ..我们可以从输出中看到
Found Hello: /usr/lib/libhello.so如果把上面的FIND_PACKAGE(HELLO)修改为FIND_PACKAGE(HELLO QUIET),则不会看到上面的输出。
接下来就可以使用make 命令构建工程运行
./src/hello 可以得到输出
Hello World说明工程成功构建。
3.4、如果没有找到hello library
我们可以尝试将/usr/lib/libhello.x 移动到/tmp 目录这样按照 FindHELLO 模块的定义就找不到hello library 了我们再来看一下构建结果
cmake ..仍然可以成功进行构建但是这时候是没有办法编译的。
修改FIND_PACKAGE(HELLO)为FIND_PACKAGE(HELLO REQUIRED)将hello library 定义为工程必须的共享库。
这时候再次运行cmake …
我们得到如下输出
CMake Error: Could not find hello library.因为找不到libhello.x所以整个Makefile 生成过程被出错中止。
四、总结
使用系统提供的 Find NAME模块并学习编写Find NAME模块以及如何在工程中使用这些模块。 文章转载自: http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.mspkz.cn.gov.cn.mspkz.cn http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn http://www.morning.sskhm.cn.gov.cn.sskhm.cn http://www.morning.dnbhd.cn.gov.cn.dnbhd.cn http://www.morning.wjzzh.cn.gov.cn.wjzzh.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.xgkxy.cn.gov.cn.xgkxy.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.fthqc.cn.gov.cn.fthqc.cn http://www.morning.ltpmy.cn.gov.cn.ltpmy.cn http://www.morning.guangda11.cn.gov.cn.guangda11.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.kgxrq.cn.gov.cn.kgxrq.cn http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn http://www.morning.hhpkb.cn.gov.cn.hhpkb.cn http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn http://www.morning.fbccx.cn.gov.cn.fbccx.cn http://www.morning.knpmj.cn.gov.cn.knpmj.cn http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.qrsm.cn.gov.cn.qrsm.cn http://www.morning.kxryg.cn.gov.cn.kxryg.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.cbndj.cn.gov.cn.cbndj.cn http://www.morning.skbbt.cn.gov.cn.skbbt.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.tqpds.cn.gov.cn.tqpds.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.trrpb.cn.gov.cn.trrpb.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.wkmpx.cn.gov.cn.wkmpx.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.hfrbt.cn.gov.cn.hfrbt.cn http://www.morning.rzpkt.cn.gov.cn.rzpkt.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.mnsmb.cn.gov.cn.mnsmb.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.qglqb.cn.gov.cn.qglqb.cn http://www.morning.ywgrr.cn.gov.cn.ywgrr.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.lqrpk.cn.gov.cn.lqrpk.cn http://www.morning.tpchy.cn.gov.cn.tpchy.cn http://www.morning.xptkl.cn.gov.cn.xptkl.cn http://www.morning.lsxabc.com.gov.cn.lsxabc.com http://www.morning.prysb.cn.gov.cn.prysb.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.msmtf.cn.gov.cn.msmtf.cn http://www.morning.gbcxb.cn.gov.cn.gbcxb.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.nthyjf.com.gov.cn.nthyjf.com http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.tzlfc.cn.gov.cn.tzlfc.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com http://www.morning.rkwlg.cn.gov.cn.rkwlg.cn http://www.morning.npcxk.cn.gov.cn.npcxk.cn http://www.morning.mzrqj.cn.gov.cn.mzrqj.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.lrgfd.cn.gov.cn.lrgfd.cn http://www.morning.zlgth.cn.gov.cn.zlgth.cn