cmake basic

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake basic相关的知识,希望对你有一定的参考价值。

参考技术A

参考链接

一般我们用cmake进行build都是按照这样的操作:

把编译生成的文件放入build中,不至于影响源文件。

上面的做法缺乏一些灵活性,比如我们的编译工具不用make,而是其他工具如ninja,则需要修改上面的命令。
如果把 make 改为 cmake --build . ,则可以解决这个问题。

Minimal version
cmake的开头一般为

指令的大小写无关紧要。
VERSION是这个指令的专用keyword,它之后跟的是其值。

Project
然后,会跟上

这里的所有keyword都是可选项。

Executable

one 是生成的可执行文件名,也是cmake中的target。
之后列出的是要用到的所有suorce files。个数不限。
头文件一般会被忽略,把它放进来是为了在IDE中显示。

Library

library的类型可以为STATIC、SHARED、MODULE。如果没有在指令中指定,则会使用 BUILD_SHARED_LIBS 中的值。
指令会根据所处平台生成库文件,比如libanother.a或another.lib等。

Target

若"one"是executable,则PUBLIC在这里没有意义。
若"one"是library,则PUBLIC表示所有link到one的target,都需要Include "inc"路径。

我们可以将target串起来:

这表示another依赖于one。
target_link_libraries 是个很有用但也很复杂的指令,用法很多。

Target是cmake中非常关键的一个概念。围绕它可以做include directories, linked libraries (or linked targets), compile options, compile definitions, compile features等等操作。
熟悉了Target,你会知道cmake的优秀之处。

Example
来看一个例子,以更好地串联上述概念。

在执行cmake以及make的时候,为了解其详细运行过程,我们可以在CMakeLists.txt中加上
set(CMAKE_VERBOSE_MAKEFILE ON)

CMakeLists.txt 结构

【中文标题】CMakeLists.txt 结构【英文标题】:CMakeLists.txt structure 【发布时间】:2018-08-17 16:28:38 【问题描述】:

我想开始一个 cmake 项目,我有很多文件。结构如下。

types.h 包含在 functions.hdag.h

functions.h 包含在basic.cpp, br.cpp, IR.cppUIR.cpp

functions.hdag.h 包含在 dag.cpp, dag-cmp.cpp, dag-cover.cpp, dag-make.cppdag-sum.cpp

显然我在同一目录中也有一个main.cpp,其中包括types.h, dag.hfunctions.h

对于 CMakeLists.txt 和 cmake 项目,哪个是最佳解决方案?

【问题讨论】:

【参考方案1】:

我认为没有最好的解决方案,但我更喜欢以下解决方案:

cmake_minimum_required(VERSION 3.12)
project(myproject)

set(SOURCE_FILES
    basic.cpp
    br.cpp
    IR.cpp
    UIR.cpp
    dag.cpp
    dag-cmp.cpp
    dag-cover.cpp
    dag-make.cpp
    dag-sum.cpp
    main.cpp
)

set(HEADER_FILES
    types.h
    functions.h
    dag.h
)

add_executable($PROJECT_NAME $SOURCE_FILES $HEADER_FILES)

target_compile_features($PROJECT_NAME PRIVATE cxx_std_14)
使用变量$PROJECT_NAME 可以轻松更改项目名称,因为您只需更改一次。 包含所有头文件和源文件允许 IDE 知道这些文件属于项目。 设置目标的属性应该优先于更改 CMake 变量。因此,我鼓励使用target_compile_features 而不是set(CMAKE_CXX_STANDARD 14)

【讨论】:

【参考方案2】:
cmake_minimum_required(VERSION 3.12)
project(myproject)

set(CMAKE_CXX_STANDARD 14)

add_executable(myproject all.cpp all.h)

    这可能是一种可能的格式。输入空格分隔的 .cpp 和 .h 文件。如果 cpp/.h 文件包含空间,则将其写入 double 引号。

    您可以根据自己的需要编辑 C++ 标准。

    这是一个非常基本的设置, 随意根据您的要求添加内容。

【讨论】:

我不需要为任何源文件添加任何 add_library 吗? 视情况而定!你需要建库吗? 现在我想使用 cmake 运行这个 main.cpp。但是这个 main.cpp 使用了我提到的 sources.cpp 中声明的函数和结构(这些是我的 main.cpp 的源库吗?)。第二步是将项目链接到外部库。 我不这么认为。在将所有 cpps 添加到 add_executable 后尝试编译它。它可以工作。也不要忘记接受这个作为答案! 我下载了一个库并使用 cmake 构建它。它被称为海普罗。如何将该库链接到我的外部 cmake 项目之一?【参考方案3】:

假设您的所有文件都在 src/ 文件夹中。 CMake 可以自动列出它们:

file(GLOB_RECURSE source_files src/*)
add_executable(exec $source_files)

第一行将查找 src 文件夹(及其子文件夹)中的所有文件,并将列表存储在 source_files var 中。 第二行将从source_files var加载文件并将它们添加到可执行文件'exec'中

【讨论】:

GLOB_RECURSE 是一个糟糕的解决方案。 CMake 不知道何时重新运行 cmake,因此会忽略新文件。如果您可以使用 CMake 3.12,则使用 CONFIGURE_DEPENDS 选项会更好:cmake.org/cmake/help/v3.12/command/file.html#glob-recurse 是的,我没想到。使用 GLOB_RECURSE,我们必须在每次修改文件树​​时重新运行 CMake。

以上是关于cmake basic的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 |需要凉亭资产/jquery

Yii2 composer 安装失败,求助

yii初体验composer安装+环境检测

Cmake知识整理

cmake/modules/AddLLVM.cmake 处的 CMake 错误

cmake和makefile区别和cmake指定编译器(cmake -G)