cmake应用

一.常用语句/示例

1. cmake_minimum_required (VERSION 2.8)
指明Cmake最低版本号要求

2. add_executable(Demo main.cpp MathFunctions.cpp)
使用指定的源文件(.c .cpp .cc)来生成目标可执行文件

3. aux_source_directory(<dir> <variable>)
查找目录下的所有源文件,并将名称保存到变量中

4. add_subdirectory(<dir>)
指明本项目包含的子目录,则子目录下的 CMakeLists.txt 文件和源代码也会被处理

5. target_link_libraries(Demo MathFunctions)
指明可执行文件需要连接一个名为 MathFunctions 的链接库

6. add_library(MathFunctions ${DIR_LIB_SRCS})
将源文件编译为静态链接库

二.常用变量

  • PROJECT_NAME
    项目名
  • CMAKE_PROJECT_VERSION
    项目版本
  • CMAKE_SOURCE_DIR
    工程顶层目录
  • CMAKE_CURRENT_SOURCE_DIR
    当前处理的 CMakeLists.txt 所在的路径
  • CMAKE_CURRENT_LIST_FILE
    调用这个变量的 CMakeLists.txt 的完整路径
  • CMAKE_PREFIX_PATH
    find_package的一个将会进行搜索的路径子集
  • CMAKE_INSTALL_PREFIX
    执行install时的目标路径

三.常用语句模块

1. 选择面向 MSVC ABI 的编译器使用的 MSVC 运行时库
Release模式:
/MT 使用多线程静态链接运行时库
/MD 使用多线程动态链接运行时库
Debug模式:
/MTd 使用多线程静态链接运行时库
/MDd 使用多线程动态链接运行时库

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")

2. 调用第三方库
可将第三方库所在路径加入CMAKE_PREFIX_PATH 变量,通常情况下第三方库将自定义<project_name>_FOUND (是否找到库文件), <project_name>_INCLUDE_DIR (头文件路径), <project_name>_LIBRARY (库文件所在路径)

find_package(LibName REQUIRED)
if(LibName_FOUND)
  target_include_directories(main PRIVATE ${LibName_INCLUDE_DIR})
  target_link_libraries(main ${LibName_LIBRARY})
endif(LibName_FOUND)

四.应用实例

1.项目结构

Demo项目结构

2.对应cmake项目结构

Cmake项目结构

person下CmakeLists.txt编写方式:

cmake_minimum_required (VERSION 3.8)

aux_source_directory(. DIR_LIB_SRCS) #将当前目录下的源文件名传入DIR_LIB_SRCS
add_library(Person ${DIR_LIB_SRCS})  #将源文件编译为静态库(.lib),命名为Person

Demo下CmakeLists.txt编写方式:

cmake_minimum_required (VERSION 3.8)

aux_source_directory(. DIR_SRCS)
add_subdirectory(person)    #添加子目录person,使得其下CMakeLists.txt能被解析
add_executable(demo ${DIR_SRCS})   #使用当前目录下的文件编译为可执行文件demo
target_link_libraries(demo Person)   #链接person目录下的静态库Person.lib

注:以上方式为将子目录文件编译为静态库供main来进行调用的方式,也有其余写法,如利用 aux_source_directory 获取子目录源文件名,并添加到add_executable 内也可以执行

3.当使用find_package函数查找库的包含目录与库目录时需要知道由xxConfig.cmake或Findxx.cmake所定义的变量名以使用target_include_directories与target_link_libraries函数,则可以使用如下语句查看已定义的变量名(以jsoncpp为例):

get_directory_property(_vars_before VARIABLES) 
find_package(JsonCpp) 
get_directory_property(_vars VARIABLES) 

list(REMOVE_ITEM _vars _vars_before ${_vars_before}) 
foreach(_var IN LISTS _vars) 
    message(STATUS "${_var} = ${${_var}}") 
endforeach() 

上述语句来源: 如何知道CMakeLists的库变量名?

Related post

  1. Java IO流

    2020-07-31

  2. Setting Up and Maintaining a Ubuntu Environment for My Home Server

    2023-11-24

  3. 将python脚本挂至服务器后台自动运行

    2020-07-05

  4. 汇编基础:常用指令(X86)

    2020-08-28

There are no comment yet.

COMMENT

Take a Coffee Break

Recommend post

  1. 常用工具指令

    2022-09-18

Category list

ABOUT

Welcome to FullStar, a captivating online destination where the realms of software development and personal reflections intertwine.

April 2025
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  

Life Logs

  1. 回首

    2023-07-14

Return Top