Cmake管理工程时如何使用外部程序库

在开发软件的时候我们常会用到一些库函数,这些库函数在不同的系统中的安装位置可能不同,编译的时候首先要找到这些软件包的头文件以及链接库所在的目录,以便生成编译选项。例如在一个需要使用数据库项目中,需要头文件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   )


文件Findlibdb_cxx.cmake的命名要符合规范:FindlibNAMEcmake,其中的NAME是库函数库的名称。Findlibdb_cxx.cmake的语法与CmakeLists.txt相同。这里使用三个命令:MESSAGEFIND_PATHFIND_LIBARY

命令 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/


参考文献:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值