二.编写属于自己的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模块再开始寻找头文件和库文件的逻辑关系.