首页 > 学院 > 开发设计 > 正文

Cmake中查找并使用其他程序库

2019-11-06 06:49:24
字体:
来源:转载
供稿:网友

在开发软件的时候我们会用到一些函数库,这些函数库在不同的系统中安装的位置可能不同,编译的时候需要首先找到这些软件包的头文件以及链接库所在的目录以便生成编译选项。例如一个需要使用博克利数据库项目,需要头文件db_cxx.h 和链接库 libdb_cxx.so ,现在该项目中有一个源代码文件 main.cpp ,放在项目的根目录中。

第一步,程序库说明文件

在项目的根目录中创建目录 cmake/modules/ ,在 cmake/modules/ 下创建文件 Findlibdb_cxx.cmake ,内容如下:

文件 Findlibdb_cxx.cmake
01 MESSAGE(STATUS "Using bundled Findlibdb.cmake...")02
03 FIND_PATH(04   LIBDB_CXX_INCLUDE_DIR05   db_cxx.h 06   /usr/include/ 07   /usr/local/include/ 08   )09 10 FIND_LIBRARY(11   LIBDB_CXX_LIBRARIES NAMES  db_cxx12   PATHS /usr/lib/ /usr/local/lib/13   )

文件 Findlibdb_cxx.cmake 的命名要符合规范: FindlibNAME.cmake ,其中NAME 是函数库的名称。Findlibdb_cxx.cmake 的语法与 CMakeLists.txt 相同。这里使用了三个命令: MESSAGE , FIND_PATH 和 FIND_LIBRARY 。

命令 MESSAGE 将参数的内容输出到终端命令 FIND_PATH 指明头文件查找的路径,原型如下find_path(<VAR> name1 [path1 path2 ...]) 该命令在参数 path* 指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR 中。清单538行的意思是在 /usr/include/  /usr/local/include/ 中查找文件db_cxx.h ,并将db_cxx.h所在的路径保存在 LIBDB_CXX_INCLUDE_DIR中。命令 FIND_LIBRARY  FIND_PATH 类似,用于查找链接库并将结果保存在变量中。清单51013行的意思是在目录 /usr/lib/ /usr/local/lib/ 中寻找名称为 db_cxx 的链接库,并将结果保存在 LIBDB_CXX_LIBRARIES

第二步, 在项目的根目录中创建 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})07
08 FIND_PACKAGE( libdb_cxx REQUIRED)09 MARK_AS_ADVANCED(10 LIBDB_CXX_INCLUDE_DIR11 LIBDB_CXX_LIBRARIES12 )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 中查找 Findlibdb_cxx.cmake ,8-19 行表示查找链接库和头文件的过程。第8行使用命令 FIND_PACKAGE 进行查找,这条命令执行后 CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findlibdb_cxx.cmake 并执行。第13-19行是条件判断语句,表示如果 LIBDB_CXX_INCLUDE_DIR 和 LIBDB_CXX_LIBRARIES 都已经被赋值,则设置编译时到 LIBDB_CXX_INCLUDE_DIR 寻找头文件并且设置可执行文件 main 需要与链接库 LIBDB_CXX_LIBRARIES 进行连接。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表