CMake日常配置使用

概述

最近在搞一个C/C++的库,以前编译都会通过makefile来组织库和代码之前的依赖关系,对于简单点的依赖,写起来还好,但项目编译的变得复杂的时候,写起来就比较累了,所以就换成Cmake的编译方式去实现这个功能,你会发现事情变得简单了。 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,简单点说就是cmake命令会根据CMakeLists.txt的配置来生成make命令所需要makefile文件。

接下来我会把CMakeLists.txt日常使用的配置记录下来,命令不区分大小写,变量区分大小写,对于以下内容如理解有不对的地方请指出。

设置CMake命令运行的最低版本

cmake_minimum_required(VERSION 2.8)

当前最新版本为3.14

设置项目名称

project(CMake_Demo)

set命令给对应的变量赋值

//赋值
set(VAR "abc")
//访问变量
VAR = ${VAR}

使用语法 ${Name} 来访问名字为 Name 的变量的值。在字符串中也可以使用 ${Name} 来访问变量的值

unset移除变量

unset(VAR)

用于在执行CMake命令时,打印执行信息

message 打印信息

message ("VAR = ${VAR}")

用于在执行CMake命令时,打印执行信息

条件控制和循环结构

set(RELEASE TRUE)
if(RELEASE)
	message("RELEASE = ${VAR}")
else()
	message("DEBUG = ${VAR}")
endif()

对于 if(string) 来说:
如果 string 为(不区分大小写)1、ON、YES、TRUE、Y、非 0 的数则表示真
如果 string 为(不区分大小写)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 结尾的字符串则表示假
如果 string 不符合上面两种情况,则 string 被认为是一个变量的名字。变量的值为第二条所述的各值则表示假,否则表示真。
此策略(Policy)在 CMake2.8.0 才被引入

find_package命令

find_package(Threads REQUIRED)

find_package可以根据cmake内置的.cmake的脚本去找相应的库的模块,这样子就可以使用linux内置的多进程库了

include命令

include(file1 [OPTIONAL])
include(module [OPTIONAL])

//编译引入的第三方库,具体请看ExternalProject_Add命令
include(ExternalProject)

可以指定载入一个文件,如果定义的是一个模块,那么将在CMAKE_MODULE_PATH中搜索这个模块并载入。

include_directories

//"include_directories"用来指定build时需要的头文件路径
//"PROJECT_BINARY_DIR"是内置变量,表示工程编译的目录,也就是--prefix指定的目录
include_directories("${PROJECT_BINARY_DIR}" "${include_dir}")

aux_source_directory命令

aux_source_directory(. DIR_SRCS)

用于将 dir 目录下的所有源文件的名字保存在变量 DIR_SRCS中

add_executable命令

add_executable(demo ${COMMON_SRCS} ${SRCS})

用于指定从一组源文件 COMMON_SRCS SRCS … sourceN 编译出一个可执行文件且命名为 demo

add_library命令

add_library(demo ${COMMON_SRCS} ${SRCS})

用于指定从一组源文件 COMMON_SRCS SRCS … sourceN 编译出一个库文件且命名为 demo

add_dependencies命令

add_dependencies(demo depend-target1 depend-target2)

用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须是 add_executable、add_library、add_custom_target 命令创建的目标

target_link_libraries命令

target_link_libraries(demo SHARED item1  item2...)

用于指定 demo需要链接item1 item2…。这里 demo必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加) demo

C 编译标志相关变量

CMAKE_C_FLAGS
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]

C++ 编译标志相关变量

CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_C_FLAGS 或CMAKE_CXX_FLAGS 可以指定编译标志
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]或 CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO] 则指定特定构建类型的编译标志,这些编译标志将被加入到 CMAKE_C_FLAGS 或 CMAKE_CXX_FLAGS 中去,例如,如果构建类型为 DEBUG,那么 CMAKE_CXX_FLAGS_DEBUG 将被加入到 CMAKE_CXX_FLAGS中去

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLOG_DEBUG -g")

ExternalProject_Add引用第三方库

set(createSqliteManifestScript "${CMAKE_CURRENT_SOURCE_DIR}/prepare_sqlite.sh")
ExternalProject_Add(libsqlite
  PREFIX "${CMAKE_BINARY_DIR}/deps"
  GIT_REPOSITORY "https://github.com/mackyle/sqlite"
  #GIT_REPOSITORY "$ENV{HOME}/dev/github/sqlite"
  GIT_TAG "version-3.26.0"
  CONFIGURE_COMMAND ${createSqliteManifestScript} && ./configure
  BUILD_IN_SOURCE 1
  BUILD_COMMAND make
  INSTALL_COMMAND "" 
  TEST_COMMAND "" 
  UPDATE_COMMAND "" 
  GIT_SHALLOW 1
  GIT_PROGRESS 1
  )
ExternalProject_Get_Property(libsqlite SOURCE_DIR)
set(SQLITE3_INCLUDE_DIR ${SOURCE_DIR})
set(SQLITE3_LIBRARY_DIR ${SOURCE_DIR}/.libs)
add_library(sqlite IMPORTED STATIC GLOBAL)
add_dependencies(sqlite libsqlite)
set_target_properties(sqlite PROPERTIES IMPORTED_LOCATION "${SQLITE3_LIBRARY_DIR}/libsqlite3.a")

最后链接的时候执行以下命令,就可以把sqlite加入到demo库中
target_link_libraries(demo sqlite)

总结

有更多的命令就没有时间去罗列出来了,如果平时自己需要用到哪个命令,大家最好上去官网查看更多用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用CMake配置OpenCV时,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Qt和CMake,并且已经下载了OpenCV的安装包。 2. 打开你的Qt项目,并在项目根目录下创建一个CMakeLists.txt文件。 3. 在CMakeLists.txt文件中,使用find_package命令来查找OpenCV库。这个命令会自动找到OpenCVConfig.cmake文件并导入所需的变量。例如: ``` find_package(OpenCV REQUIRED) ``` 4. 使用include_directories命令将OpenCV的头文件目录添加到你的项目中。这样,你就可以在代码中使用OpenCV的函数和类了。例如: ``` include_directories(${OpenCV_INCLUDE_DIRS}) ``` 5. 在你的项目中,使用target_link_libraries命令将OpenCV的库文件链接到你的可执行文件中。例如: ``` target_link_libraries(your_project_name ${OpenCV_LIBS}) ``` 6. 最后,使用CMake来生成你的项目文件。你可以使用命令行或者Qt的CMake插件来完成这个步骤。 通过以上步骤,你就可以成功地使用CMake配置OpenCV库来进行Qt开发了。引用\[1\]中的OpenCVConfig.cmake文件会为你导出所需的变量,使得你可以方便地使用OpenCV的功能。而引用\[2\]中提到,对于初学者或者不需要使用OpenCV_contrib库的情况,建议直接下载OpenCV的安装包来使用,而不是自己编译。这样可以避免一些下载库的问题和编译过程中的困扰。然而,如果你需要使用OpenCV_contrib库或者有特定的需求,那么自己编译可能是更好的选择。 #### 引用[.reference_title] - *1* *2* [windows10下Qt环境OpenCV配置CMake环境】](https://blog.csdn.net/weixin_40583088/article/details/127467176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值