cmake记录

news/2025/1/11 16:41:32/

文章目录

        • 常用变量
        • find_package用法
        • pkg-config
        • 示例

常用变量

  • 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)

http://www.ppmy.cn/news/150814.html

相关文章

中国无线电池监控系统市场趋势报告、技术动态创新及市场预测

无线电池监控系统市场的企业竞争态势 该报告涉及的主要国际市场参与者有Benchmarking、NDSL、Texas Instruments、Powershield、Batterydaq、Canara、Eagle Eye、HBL、Btech、SBS、Schneider Electric、ABB、Socomec、Curtis等。这些参与者的市场份额、收入、公司概况和SWOT分析…

基于JavaEE电子商务交易系统

目录 1 概论 1 1.1电子商务交易发展 1 1.1.1电子商务交易 1 1.1.2发展前景&#xff1a; 1 2 系统可行性及需求分析 3 2.1 系统调研 3 2.2 系统可行性分析 3 2.2.1技术可行性分析 3 2.2.2 操作可行性分析 3 2.2.3 社会可行性分析 4 2.2.4可行性分析小结 4 2.3 系统需求分析 4 2.…

电子商务交易系统的设计与实现(javaee+mysql)

目录 1 概论 1 1.1电子商务交易发展 1 1.1.1电子商务交易 1 1.1.2发展前景&#xff1a; 1 2 系统可行性及需求分析 3 2.1 系统调研 3 2.2 系统可行性分析 3 2.2.1技术可行性分析 3 2.2.2 操作可行性分析 3 2.2.3 社会可行性分析 4 2.2.4可行性分析小结 4 2.3 系统需求分析 4 2.…

Pokémon Go呼应设计:让全世界玩家疯狂沉迷

引言&#xff1a;什么样的呼应设计会让移动游戏玩家沉迷&#xff1f;那必须为玩家构建一个属于玩家本人或者被玩家认可的虚拟环境&#xff0c;或者说是被玩家认可的虚拟世界。在移动游戏时代&#xff0c;想要做到这一点并不容易。但Pokmon Go却做到了&#xff0c;它让全世界玩家…

阿里云CentOS环境之-实战docker集群swarm(十五)

前言docker1.12版本之前版本配置 准备工作开始 拉取swarm开放2375远程访问端口创建集群的token向集群里添加结点查看集群里有哪些结点创建管理者容器 使用集群离开集群 docker1.12版本之后版本配置 准备工作开始 集群初始化&#xff0c;在云1上执行。查看结点测试 查看创建的服…

浅谈NDS下GBA卡带烧录代码-1.基础的写入、读取代码

早期的nds和后来的ndsl具有读取GBA卡带的功能&#xff0c;通过nds烧录卡启动一些nds自制软件可以完成对一些gba卡带的烧录功能&#xff0c;从而实现游戏更换。 gba卡带游戏内容映射起点在0x8000000&#xff0c;记录文件映射起点在0xa000000&#xff0c;游戏卡带基本采用了norf…

修复 DSL 自动开关机的问题 ( NDSL / iDSL 自动开机 自动关机 修理)

DSL 发生自动开机 、自动关机的问题主要是由于ABXY长期按压导致主板轻微变形&#xff0c;背面的电源IC&#xff08;U3&#xff09;脱焊所致。此IC同时有管理音量的作用&#xff0c;如果声音有问题也可尝试补焊或更换IC。 适用症状&#xff1a;自动开机、自动关机&#xff1b;耳…

黑色美版NDSL入手

在11月11号这个光棍节也是PS3的发售日 为了表示对SONY的鄙视和对PS3的无视 入手了NDSL M3L 1GTF 包 贴膜 火牛 2000元RMB整 转载于:https://www.cnblogs.com/oiramario/archive/2006/11/13/559248.html