Cmake用法

1.List用法

list(LENGTH <list><output variable>) 

list(GET <list> <elementindex> [<element index> ...]<output variable>)

list(APPEND <list><element> [<element> ...])

list(FIND <list> <value><output variable>)

list(INSERT <list><element_index> <element> [<element> ...])

list(REMOVE_ITEM <list> <value>[<value> ...])

list(REMOVE_AT <list><index> [<index> ...])

list(REMOVE_DUPLICATES <list>)

list(REVERSE <list>)

list(SORT <list>)

LENGTH返回list的长度

GET返回list中index的element到value中

APPEND 添加新element到list中

FIND 返回list中element的index,没有找到返回-1

INSERT 将新element插入到list中index的位置

REMOVE 从list中删除某个element

REMOVE_AT从list中删除指定index的element

EMOVE_DUPLICATES从list中删除重复的element

REVERSE将list的内容反转

SORT将list按字母顺序排序

2.file用法

1)Reading

file(READ <filename> <variable>
     [OFFSET <offset>] [LIMIT <max-in>] [HEX])

从名为的文件中读取内容<filename>并将其存储在 <variable>. 可选择从给定的开始<offset>并最多读取<max-in>字节。该HEX选项将数据转换为十六进制表示

file(STRINGS <filename> <variable> [<options>...])

#解析 ASCII 字符串列表<filename>并将其存储在 <variable>.variable中新建一个列表,然后每一个项目都是输入文件的一行

file(<HASH> <filename> <variable>)

#计算内容的加密哈希<filename>并将其存储在<variable>. 支持的<HASH>算法名称是由string() 命令列出的名称。

file(TIMESTAMP <filename> <variable> [<format>] [UTC])

#计算修改时间的字符串表示<filename> 并将其存储在<variable>. 如果命令无法获取时间戳变量,则将设置为空字符串(“”)

2)Writing

file(WRITE <filename> <content>...)
file(APPEND <filename> <content>...)

写入/加入<content>一个名为<filename>. 如果文件不存在,则会创建它

3)Filesystem

file(GLOB <variable>
     [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
     [<globbing-expressions>...])
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
     [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
     [<globbing-expressions>...])

生成与 匹配的文件列表<globbing-expressions>并将其存储到<variable>. 这里用一个例子说明:

file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")

捕获所有src目录下面的.cpp 文件作为源文件 (NODE_SRCS)

file(REMOVE [<files>...])
file(REMOVE_RECURSE [<files>...])

删除给定的文件。该REMOVE_RECURSE模式将删除给定的文件和目录,以及非空目录。如果给定文件不存在,则不会发出错误

file(RENAME <oldname> <newname>
     [RESULT <result>]
     [NO_REPLACE])

将文件系统中的文件或目录从 <oldname><newname>,以原子方式替换目标。

4)Path Conversion

#计算已解析符号链接的现有文件或目录的绝对路径。
file(REAL_PATH <path> <out-var> [BASE_DIRECTORY <dir>] [EXPAND_TILDE])
#计算从 a<directory>到 a的相对路径<file>并将其存储在<variable>.
file(RELATIVE_PATH <variable> <directory> <file>)

5)Transfer

file(DOWNLOAD <url> [<file>] [<options>...])
file(UPLOAD   <file> <url> [<options>...])

DOWNLOAD子命令将给定的内容下载<url>到本地<file>。该UPLOAD模式将本地上传<file>到给定的<url>.

6)Locking

file(LOCK <path> [DIRECTORY] [RELEASE]
     [GUARD <FUNCTION|FILE|PROCESS>]
     [RESULT_VARIABLE <variable>]
     [TIMEOUT <seconds>])

<path>如果不存在DIRECTORY选项, 则锁定指定的文件,<path>/cmake.lock否则锁定文件。文件将被 GUARD选项定义的范围锁定(默认值为PROCESS)。RELEASE选项可用于显式解锁文件。如果TIMEOUT未指定选项,CMake 将等待锁定成功或发生致命错误。如果TIMEOUT设置为 0锁定,将尝试一次并立即报告结果。如果 TIMEOUT不是0,CMake 将尝试在<seconds>value 指定的时间段内锁定文件。如果没有 RESULT_VARIABLE选项,任何错误都将被解释为致命错误。否则结果将被存储<variable>0在成功或失败时显示错误消息。

7)Archiving

file(ARCHIVE_CREATE OUTPUT <archive>
  PATHS <paths>...
  [FORMAT <format>]
  [COMPRESSION <compression> [COMPRESSION_LEVEL <compression-level>]]
  [MTIME <mtime>]
  [VERBOSE])

3.include用法

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
                      [NO_POLICY_SCOPE])

include 指令用来载入并运行来自于文件或模块的 CMake 代码。比如:

调用一个包,就是常规三步:find_package,include_directions,target_link_libraries

有时候还需要一些判断,就加一些if else。

这样也是同样的问题,包多的时候代码太杂。所以我们把每个包对应的这些操作放在cmake文件夹下对应的XX.cmake文件中,然后在CMakeLists中 include(cmake/XX.cmake)一行代码就可以搞定。

4.find_package用法

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
  • PackageName:依赖包名称;
  • version:版本号,如果指定,那么find_package一定要检查找到的包是否与与version版本兼容;
  • EXACT:如果指定,表示必须完全匹配version指定版本的包而不是仅仅兼容就可以;
  • QUIET:如果指定,表示disable信息输出,即命令运行时不输出相关message,即使没有找到该包。但是如果REQUIRED被指定,还是会有信息输出;
  • MODULE:表示只用于module模式,即使没有找到也不会进入CONFIG模式;
  • REQUIRED:表示此包是必须的,如果没有找到,构建程序报错并终止;
  • [COMPONENTS] [components…]:表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行;
  • OPTIONAL_COMPONENTS components…:可选的依赖组件,即使找不到也不会影响cmake继续执行;

5.set用法

set(<variable> <value>... [PARENT_SCOPE])

<value>赋值给<variable>

6.add_executable

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])

添加一个<name>从命令调用中列出的源文件构建的可执行目标。对应于逻辑目标名称, <name>并且在项目中必须是全局唯一的。[source1] [source2 ...]:构建可执行目标文件所需要的源文件。也可以通过target_sources()继续为可执行目标文件添加源文件,要求是在调用target_sources之前,可执行目标文件必须已经通过add_executableadd_library定义了。

CMake是一个跨平台的自动化构建工具,可以用于生成各种不同类型的构建文件,包括Makefile、Visual Studio解决方案、Xcode项目等。下面是CMake的使用方法详解: 1. 安装CMake 首先需要在官网上下载并安装CMake软件。安装完成后,可以在命令行中输入cmake --version来确认是否安装成功。 2. 创建一个CMakeLists.txt文件 在项目根目录下创建一个名为CMakeLists.txt的文件,该文件是CMake的核心配置文件,定义了项目的构建规则。可以使用文本编辑器或者IDE来创建这个文件。 3. 设置项目信息 在CMakeLists.txt文件中,需要设置项目的基本信息,包括项目名称、版本号、语言等。这可以通过使用project命令来实现。例如: ``` project(MyProject VERSION 1.0 LANGUAGES CXX) ``` 这里设置了项目名称为MyProject,版本号为1.0,使用C++作为编程语言。 4. 定义源文件 在CMakeLists.txt文件中,需要定义项目的源文件。可以使用add_executable或add_library命令来添加源文件。例如: ``` add_executable(myapp main.cpp) ``` 这里添加了一个名为myapp的可执行文件,它的源文件是main.cpp。 5. 添加依赖库 如果项目依赖于其他库,需要使用find_package或者add_subdirectory命令来添加依赖库。例如: ``` find_package(Boost REQUIRED COMPONENTS filesystem system) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(myapp ${Boost_LIBRARIES}) ``` 这里添加了一个名为Boost的库,它的组件是filesystem和system。 6. 设置编译选项 在CMakeLists.txt文件中还可以设置编译选项,例如编译标志、链接标志等。可以使用target_compile_options和target_link_libraries命令来设置编译选项。例如: ``` target_compile_options(myapp PRIVATE -Wall -Wextra) target_link_libraries(myapp pthread) ``` 这里设置了编译标记为-Wall和-Wextra,链接标记为pthread。 7. 构建项目 完成以上步骤后,就可以使用cmake命令来生成构建文件,例如: ``` mkdir build cd build cmake .. ``` 这里在项目根目录下创建了一个build目录,并在其中使用cmake命令生成Makefile文件。 最后,使用make命令来编译和构建项目。例如: ``` make ``` 这里编译和构建了项目,并生成myapp可执行文件。 以上就是CMake的使用方法详解。通过CMake,可以方便地管理项目的构建过程,实现跨平台的构建。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值