Cmake实践:第九章__模块的使用和自定义模块编译出现问题

 

二.编写属于自己的FindHello

模块。我们在此前的t3实例中,演示了构建动态库、静态库的过程并进行了安装。接下来,我们在t6示例中演示如何自定义FindHELLO模块并使用这个模块构建工程:请在建立/backup/cmake/ 中建立t6目录,并在其中建立cmake 目录用于存放我们自己

定义的FindHELLO.cmake 模块,同时建立src 目录,用于存放我们的源文件。
1,定义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)

针对上面的模块让我们再来回顾一下FIND_PACKAGE 指令:FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]

[[REQUIRED|COMPONENTS] [componets...]]) 前面的CURL 例子中我们使用了最简单的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 指令中使用。OK,下面建立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)

上面都是按照<<Cmake实践>>构建自己的FindHELLO.cmake模块

三.使用自定义的FindHELLO

模块构建工程仍然采用外部编译的方式,建立build 目录,进入目录运行:cmake ..

出现了bug,如下所示:

CMake Warning at src/CMakeLists.txt:1 (FIND_PACKAGE):
  By not providing "FindHELLO.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "HELLO", but
  CMake did not find one.

  Could not find a package configuration file provided by "HELLO" with any of
  the following names:

    HELLOConfig.cmake
    hello-config.cmake

  Add the installation prefix of "HELLO" to CMAKE_PREFIX_PATH or set
  "HELLO_DIR" to a directory containing one of the above files.  If "HELLO"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring done
-- Generating done
-- Build files have been written to: /media/lzm/Study/YanEr/CMakePractice/cmake/t6/build

 主要解决方法:

将寻找.cmake模块的代码段

SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

写在src/CMakeLists.txt 文件顶端,存在先找到.cmake模块再开始寻找头文件和库文件的逻辑关系.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maccy37

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值