cmake基础

本文介绍CMake的基础使用方法,包括如何指定编译器、添加源文件、设置编译选项等。同时提供了添加头文件和库文件目录的方法,并通过实例演示了如何构建一个简单的工程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 cmake 选项
-G        指定一个makefile生成工具。

二 常用命令
1 添加头文件目录和库文件目录
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])相当于-I
link_directories(directory1 directory2 ...)                    相当于-L

2 set        设置变量
set(var "test")   调用${var}即为"test"

3 使用给定的源文件,为工程引入一个可执行文件
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                 [EXCLUDE_FROM_ALL]
                 source1 source2 ... sourceN)
    
4 使用给定的源文件,为工程生成一个库,并添加到工程
add_library(<name> [STATIC | SHARED | MODULE]
              [EXCLUDE_FROM_ALL]
              source1 source2 ... sourceN)

5 将dir目录下的所有源文件放到variable变量中
aux_source_directory(<dir> <variable>)              

6 查找库文件
find_library(<VAR> name1 [path1 path2 ...])

7 将给定的库链接到一个目标上
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

8 为构建添加一个子路径
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

9 为源文件的编译添加选项 如-g -w
add_definitions(-DFOO -DBAR ...)

10 列表操作
list(<cmd> <list> ..)
使用LENGTH选项时,该命令会返回给定list的长度。
使用GET选项时,该命令返回list中所有被index索引的元素构成的list。
使用APPEND选项时,该命令将会在该list之后追加若干元素。
使用FIND选项时,该命令将返回list中指定的元素的索引;若果未找到,返回-1。
使用INSERT选项时,该命令将在list中指定的位置插入若干元素。
使用REMOVE_AT和REMOVE_ITEM选项将会从list中删除一些元素。它们之间的区别是:REMOVE_ITEM删除的是指定的项,而REMOVE_AT删除的是在指定索引处的项。
使用REMOVE_DUPLICATES选项时,该命令将删除list中的重复项。
使用REVERSE选项时,该命令将把list的内容就地前后倒换。
使用SORT选项时,该命令将按字母序对list总的内容就地排序。

cmake_minimum_required  设置一个工程所需要的最低CMake版本。
set_target_properties      设置目标的一些属性来改变它们构建的方式
file                      文件操作命令    
find_file                 查找一个文件的完整路径    
find_path                 搜索包含某个文件的路径
math                     数学表达式
project                 项目名称    
message([-] "message")    输出[STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
option                    为用户提供一个可选项
string                  字符串操作函数
unset                      撤销对一个变量
      
三 条件
比较条件见http://www.cnblogs.com/coderfenghc/archive/2012/07/29/2614253.html
if(expression)
#
elseif(expression)
#
else(expression)
#
endif(expression)

四 循环
1 foreach
(1)
set(mylist "a" "b" c "d")
foreach(_var ${mylist})
     message("当前变量是:${_var}")
endforeach()
(2)
foreach(_var RANGE 0 100)
     math(EXPR result "${result}+${_var}")
endforeach()

2 while
while(condition)
    COMMAND1(ARGS ...)
    ...
endwhile(condition)
while与endwhile之间的命令将被记录但不执行。当endwhile中的condition为真时才执行

五 宏和方法
1 宏
macro( [arg1 [arg2 [arg3 ...]]])
     COMMAND1(ARGS ...)
     ...
endmacro()
eg.
macro(sum outvar)
     set(_args ${ARGN})
     set(result 0)

     foreach(_var ${_args})
         math(EXPR result "${result}+${_var}")
     endforeach()

     set(${outvar} ${result})
endmacro()
sum(addResult 1 2 3 4 5)
ARGN系统变量,指代入宏中多余的参数,即12345
addResult即outvar,可以得到最后的结果
2 方法
function(<name> [arg1 [arg2 [arg3 ...]]])
    COMMAND1(ARGS ...)
    ...
endfunction(<name>)
与宏类似,宏中的变量是全局的,方法中的是局部的,宏中的结果可以直接传递出来,方法不方便

六 常量
CMAKE_CACHEFILE_DIR      文件CMakeCache.txt所在的路径
CMAKE_C_COMPILER        指定C编译器
CMAKE_CXX_COMPILER            c++
EXECUTABLE_OUTPUT_PATH    可执行文件的输出路径

小例子:
cmake_minimum_required (VERSION 2.8)    #设置最小版本
project(player)                                                 #设置工程名
set(target player)
SET(CMAKE_C_COMPILER g++)                #设置编译器
set(SRC_LIST                                    #设置源文件     
        audio_player.c
        main.c
        )

set(LIB                                    #添加依赖库
        -lavformat -lavcodec -lavformat -lavutil -lswresample -lswscale
        -lSDL2 -lSDL2main -lm
        -lpthread -lz      
)

add_definitions(                        #添加编译选项
        -g -w
)

INCLUDE_DIRECTORIES(                    #添加头文件目录 相当于gcc的-I
        /usr/local/include/
)

LINK_DIRECTORIES(                        #添加库文件目录 相当于gcc的-L
        /usr/local/lib/
)

add_executable(${target} ${SRC_LIST})           #生成可执行文件
target_link_libraries(${target} ${LIB})         #添加依赖

执行:
mkdir build                            cmake会生成临时文件,所以创建一个目录
cd build
cmake ..

make




中文翻译:http://www.cnblogs.com/coderfenghc/tag/cmake/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值