在开发软件的时候我们会用到一些函数库,这些函数库在不同的系统中安装的位置可能不同,编译的时候需要首先找到这些软件包的头文件以及链接库所在的目录以便生成编译选项。
#文件 Findlibapue.cmake 的命名要符合规范: FindlibNAME.cmake ,其中NAME 是函数库的名称。Findlibapue.cmake 的语法与 CMakeLists.txt 相同。这里使用了三个命令: MESSAGE , FIND_PATH 和 FIND_LIBRARY
MESSAGE(STATUS "Using bundled Findlibapue.cmake...") #命令 MESSAGE 会将参数的内容输出到终端。
#命令 FIND_PATH 指明头文件查找的路径,FIND_PATH(<VAR> name1 [path1 path2 ...]) 该命令在参数 path* 指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR 中。这里的意思是在 /usr/include/ 和 /usr/local/include/ 中查找文件apue.h ,并将apue.h 所在的路径保存在 LIBAPUE_INCLUDE_DIR中。
FIND_PATH(
LIBAPUE_INCLUDE_DIR
apue.h
/usr/include/
/usr/local/include/
)
#命令 FIND_LIBRARY 同 FIND_PATH 类似,用于查找链接库并将结果保存在变量中。这里的意思是在目录 /usr/lib/ 和 /usr/local/lib/ 中寻找名称为 apue 的链接库,并将结果保存在LIBAPUE_LIBRARIES。
FIND_LIBRARY(
LIBAPUE_LIBRARIES NAMES apue
PATHS /usr/lib/ /usr/local/lib/
)
2 在项目的根目录中创建 CmakeList.txt :
#可以查找链接库的 CMakeList.txt
PROJECT(apue_chap1)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)
SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules) #表示到目录 ./cmake/modules 中查找 Findlibdb_cxx.cmake
# 查找链接库和头文件开始,这里是链接库apue库
FIND_PACKAGE(libapue REQUIRED) #使用命令FIND_PACKAGE查找,这条命令执行后CMake会到变量CMAKE_MODULE_PATH指示的目录中查找文件 Findlibapue.cmake 并执行
MARK_AS_ADVANCED(
LIBAPUE_INCLUDE_DIR
LIBAPUE_LIBRARIES
)
#if表示如果LIBAPUE_INCLUDE_DIR和LIBAPUE_LIBRARIES都被赋值,则设置编译时到LIBAPUE_INCLUDE_DIR寻找头文件并与库LIBAPUE_LIBRARIES链接
IF (LIBAPUE_INCLUDE_DIR AND LIBAPUE_LIBRARIES)
MESSAGE(STATUS "Found libapue libraries")
INCLUDE_DIRECTORIES(${LIBAPUE_INCLUDE_DIR})
MESSAGE(${LIBAPUE_LIBRARIES})
# TARGET_LINK_LIBRARIES(main ${LIBAPUE_LIBRARIES}
LINK_LIBRARIES(${LIBAPUE_LIBRARIES})
ENDIF (LIBAPUE_INCLUDE_DIR AND LIBAPUE_LIBRARIES)
# 查找链接库和头文件结束
ADD_EXECUTABLE(1-1 1-1.c)
ADD_EXECUTABLE(1-2 1-2.c)
ADD_EXECUTABLE(1-3 1-3.c)
ADD_EXECUTABLE(1-4 1-4.c)
ADD_EXECUTABLE(1-5 1-5.c)
ADD_EXECUTABLE(1-6 1-6.c)
ADD_EXECUTABLE(1-7 1-7.c)
ADD_EXECUTABLE(1-8 1-8.c)
3 完成 Findlibapue.cmake 和 CMakeList.txt 的编写后在项目的根目录依次执行 “cmake . ” 和 “make ” 可以进行编译