在开发软件的时候我们常会用到一些库函数,这些库函数在不同的系统中的安装位置可能不同,编译的时候首先要找到这些软件包的头文件以及链接库所在的目录,以便生成编译选项。例如在一个需要使用数据库项目中,需要头文件db_cxx.h和libdb_cxx.so,现在该项目中有一个源代码文件main.cpp,放在该项目的根目录中
第一步,程序库说明文件
在项目的根目录中创建目录 cmake/modules/,在下创建文件Findlibdb_cxx.cmake,内容如下:
文件Findlibdb_cxx.cmake
01 MESSAGE(STATUS "Using bundled Findlibdb.cmake...")
0203 FIND_PATH(
04 LIBDB_CXX_INCLUDE_DIR
05 db_cxx.h
06 /usr/include/
07 /usr/local/include/
08 )
09
10 FIND_LIBRARY(
11 LIBDB_CXX_LIBRARIES NAMES db_cxx
12 PATHS /usr/lib/ /usr/local/lib/
13 )
命令 MESSAGE会将参数的内容输出到终端
命令FIND_PATH指明头文件查找的路径,原型如下:find_path(<VAR> name1 [path1 path2 ...]),该命令在参数path*只是得目录中查找文件,并将查找到的路径保存在变量 VAR 中,上述的indlibdb_cxx.cmake中的第3-8行的意思是在 /usr/include/ 和 /usr/local/include中查找文件db_cxx.h,并将db_cxx.h所在的路径保存在LIBDB_CXX_INCLUDE_DIR中
命令FIND_LIBARY和FIND_PATH类似,用于查找链接库并将结果保存在变量中,indlibdb_cxx.cmake中的第10-13行的意思是在目录 /usr/include 和 /usr/local/lib/ 中寻找名称为db_cxx的链接库,并将结果保存在LIBDB_CXX_LIBARIES中
第二步,项目根目录中的CmakeList.txt
在项目的根目录中创建CmakeList.txt:
可以查找链接库的CmakeList.txt
01 PROJECT(main)
02 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
03 SET(CMAKE_SOURCE_DIR .)
04 SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)
05 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
06 ADD_EXECUTABLE(main ${DIR_SRCS})
0708 FIND_PACKAGE( libdb_cxx REQUIRED)
09 MARK_AS_ADVANCED(
10 LIBDB_CXX_INCLUDE_DIR
11 LIBDB_CXX_LIBRARIES
12 )
13 IF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
14 MESSAGE(STATUS "Found libdb libraries")
15 INCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
16 MESSAGE( ${LIBDB_CXX_LIBRARIES} )
17 TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES}18 )
19 ENDIF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
在该文件的第4行表示目录 ./cmake/modules中查找Finddb_cxx.cmake,第8-19行表示查找链接库和头文件的过程。第8行使用命令FIND_PATH进行查找,这条命令执行后Cmake会到变量CMAKE_MODULE_PATH指示的目录中查找文件Findlibdb_cxx.cmake并执行。第13-19行是条件判断语句,表示如果LIBDB_CXX_INCLUDE_DIR和LIBDB_CXX_LIBARIES都已经被赋值,则编译时到LIBDB_CXX_INCLUDE_DIR寻找文件并设置可执行文件main需要与链接库LIBDB_CXXLIBARIES进行连接
第三步,执行Cmake
完成Findlibdb_cxx.cmake和CMakeList.txt的编写后在项目的根目录依次执行“cmake .”和“make”进行编译,
结果如下图所示:
参考文献: http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/
参考文献: