cmake记录

本文详细介绍了CMake中常用的变量如CMAKE_BINARY_DIR、PROJECT_NAME等,展示了find_package和pkg-config的用法,包括如何查找并处理第三方库依赖,以及如何利用pkg-config文件管理编译链接参数。
摘要由CSDN通过智能技术生成

常用变量
  • CMAKE_BINARY_DIR、PROJECT_BINARY_DIR:如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。
  • CMAKE_SOURCE_DIR、PROJECT_SOURCE_DIR:不论采用何种编译方式,都是工程顶层目录
  • CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 所在的路径
  • CMAKE_CURRRENT_BINARY_DIR:如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录
  • CMAKE_CURRENT_LIST_FILE:输出调用这个变量的 CMakeLists.txt 的完整路径
  • CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行
  • CMAKE_MODULE_PATH:这个变量用来定义自己的cmake模块所在的路径;通过INCLUDE指令来调用模块(SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake))
  • EXECUTABLE_OUTPUT_PATH、LIBRARY_OUTPUT_PATH:分别用来重新定义最终结果的存放目录
  • PROJECT_NAME:返回通过PROJECT指令定义的项目名称
    调用环境变量:$ENV{NAME}
    指令:AUX_SOURCE_DIRECTORY(.SRC_LIST)

cmake升级了lib库(改变了文件名字), 需要将CMake产生的文件删除重新编译

find_package(OpenSSL REQUIRED)
cmake -DOPENSSL_ROOT_DIR=/home/linaro/openssl-master …

find_package用法

cmake官方为我们预定义了许多寻找依赖包的Module,他们存储在path_to_your_cmake/share/cmake-/Modules目录下,以CURL为例用法如下:

find_package(CURL)
add_executable(curltest curltest.cc)
if(CURL_FOUND)
	target_include_directories(clib PRIVATE ${CURL_INCLUDE_DIR})
	target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
	message(FATAL_ERROR ”CURL library not found”)
endif(CURL_FOUND)

对于系统预定义的 Find.cmake 模块,使用方法一般如上例所示。每一个模块都会定义以下几个变量:

  • _FOUND:判断模块是否被找到
  • _INCLUDE_DIR or _INCLUDES:模块头文件目录
  • _LIBRARY or _LIBRARIES:模块库文件目录

编写自己的Find.cmake

# 在指定目录下寻找头文件和动态库文件的位置,可以指定多个目标路径
find_path(TEST_INCLUDE_DIR libtest.h /usr/include/ /usr/local/include ${CMAKE_SOURCE_DIR}/cmake)
find_library(TEST_LIBRARY NAMES test PATHS /usr/lib/ /usr/local/lib/ ${CMAKE_SOURCE_DIR}/cmake)

if (TEST_INCLUDE_DIR AND TEST_LIBRARY)
	set(ADD_FOUND TRUE)
endif (TEST_INCLUDE_DIR AND TEST_LIBRARY)

set(CMAKE_MODULE_PATH “Findxxx.cmake文件所在的路径”)
set(xxx_DIR “xxxConfig.cmkae文件所在的路径”)

pkg-config

使用pkg-config的初级阶段是为编译和链接程序时提供必要的细节。数据存储在pkg-config文件中。这些文件有一个.pc的后缀,放在一个特定的、pkg-config工具所知道的位置。PKG_CONFIG_PATH环境变量,这个变量用来配置pkg-config的搜索路径。
pkg-config --exists:判断包是否有用
pkg-config --cflags:查看链接
pkg-config --modversion:查看版本
例如:

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo
  • Name:一个人们可读的链接库或软件包的名称,这不影响pkg-config的使用,它用的是.pc文件的名称。
  • Description:关于软件包的简单描述。
  • URL:一个URL,可以在那里获得更多的信息,并且下载这个软件包。
  • Version:软件包的版本。
  • Requires:这个软件包所需的包的列表。这些包的版本可能用一些运算符来指定:=、>、<、>=、<=。
  • Requires.private:这个软件包所需的私有包的列表,不会暴露给应用。版本的指定规则与Requires相同。
  • Conflicts:可选,描述了会与这个软件包产生冲突的包。版本的指定规则与Requires相同。这个域会提供同一个包的多个实例,例如:Conflicts: bar < 1.2.3, bar >= 1.3.0。
  • Cflags:为这个软件包指定编译器选项,以及pkg-config不支持的必要的库。如果所需的库支持pkg-config,应该将它们添加到Requires和Requires.private。
  • Libs:为这个软件包指定的链接选项,以及pkg-config不支持的必要的库。与Cflags的规则相同。
  • Libs.private:这个软件包所需的私有库的链接选项,不会暴露给应用。规则与Cflags相同。

在Cmake中使用示例:

# bfl (Bayesian Filtering Library)是一个使用pkg-config的第三方库
# 先搜索cmake自己的PkgConfig模块,才能使用pkg_check_modules
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
	pkg_check_modules(BFL REQUIRED orocos-bfl)
	if(BFL_FOUND)
		include_directories(${BFL_INCLUDE_DIRS})
		link_directories(${BFL_LIBRARY_DIRS})
	endif()
endif()
示例

CMakeLists1.txt:

cmake_minimum_required (VERSION 2.8)
project(test)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

include(test.CMake)
if (NOT HOME)
    message (FATAL_ERROR "not set HOME")
endif()

set (EXEC_PREFIX "test.exe.")
set (PRODUCT_VERSION "1.0")
set (CMAKE_CXX_FLAGS " -std=c++11 -fPIC")
add_definitions (-DNO_LOG_FILE)
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)


set (CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -Wl,-rpath=./lib/")
set (CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -Wl,-rpath=../lib/")

if (CMAKE_BUILD_TYPE STREQUAL Debug)
	set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -O0")
	add_definitions (-DDEBUG)
	message (STATUS "CMAKE_BUILD_TYPE=Debug -O0")
else()
	set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2")
	message (STATUS "CMAKE_BUILD_TYPE=Release -O2")
endif()

add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/test)

CMakeLists2.txt:

cmake_minimum_required (VERSION 2.8)

project(${EXEC_PREFIX}kafka_consumer)

find_package(Qt5Sql REQUIRED)
find_package(Qt5Core REQUIRED)

set(OpenCV_DIR /home/linaro/ndsl_facerec_sdk.2.5.9.24/third_party/share/OpenCV)
find_package(OpenCV REQUIRED)
#list (APPEND openblas)

include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Sql_INCLUDE_DIRS})

file(GLOB_RECURSE worker_srcs ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)
file(GLOB_RECURSE worker_incs ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

#file(GLOB worker_srcs ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)
#file(GLOB worker_incs ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
list (REMOVE_ITEM worker_srcs "${CMAKE_CURRENT_SOURCE_DIR}/kafkaConMain.cpp")

include_directories (${CMAKE_CURRENT_SOURCE_DIR})
include_directories (${MAKE_BINARY_DIR}/include)

link_directories(${LIBRARY_OUTPUT_PATH})

add_library(consumer STATIC ${worker_srcs} ${worker_incs})
target_link_libraries(consumer pthread json rdkafka rt boost_system Qt5Sql Qt5Core ${OpenCV_LIBS} z dl)

add_executable(${PROJECT_NAME} kafkaConMain.cpp)
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${PRODUCT_VERSION})
target_link_libraries(${PROJECT_NAME} consumer)

test.CMAKE:

#use like this:
#include(test.CMake)
#


include_directories (${HOME}/include)
include_directories (${HOME}/third_party/include)
link_directories (${HOME}/lib)
link_directories (${HOME}/third_party/lib)
set (LIBS "pthread z m dl")
list (APPEND CMAKE_PREFIX_PATH ${HOME}/third_party)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值