原创

cmake学习

一、cmake整体思路

根据cmake编写命令(CMakeLists.txt),生成对应的makefile文件(Makefile)。

通过执行make命令,将Makefile转成对应的gcc/g++命令,从而生成可执行文件。

整个过程即为编译的过程。

cmake使用方法:

mkdir build
cd build
cmake path    #path 指CMakeLists.txt所在位置
make
./可执行文件    #运行可执行文件

CMakeLists.txt通用设置:

(1)cmake版本号

(2)工程名称

# $ cmake --version
cmake_minimum_required(VERSION 3.5)
# Set the project name
project (hello_cmake)

1. 单个cpp文件cmake思路

cpp文件,直接生成可执行文件。

add_executable()函数的第一个参数是要生成的可执行文件的名称,第二个参数是要编译的源文件的列表。

add_executable(hello_cmake main.cpp)  #可执行文件名, 单个cpp文件名

2. 多个cpp文件 + 头文件 cmake思路

过程:

cpp文件生成可执行文件

可执行文件链接头文件

#创建一个带有所有cpp文件链接的源变量以编译
set(SOURCES
    src/Hello.cpp
    src/main.cpp
)
#在SOURCES变量中设置特定文件名的另一种方法是使用GLOB命令使用通配符模式匹配来查找文件。
file(GLOB SOURCES "src/*.cpp")
#两种方法通用,选择其中一种使用即可。
#生成可执行文件
add_executable(hello_headers ${SOURCES})

当有其他包含文件夹时(头文件文件夹),可以使用target_include_directories()函数使编译器意识到它们

在最后的g++编译过程,会自动链接到头文件路径

target_include_directories(hello_headers
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/include                   #PROJECT_SOURCE_DIR  当前cmake项目的源目录。
)

3. 创建并链接一个静态库 cmake思路

过程:

根据源文件创建静态库,静态库链接头文件

生成可执行文件并链接静态库,静态库再链接头文件

#  add_library()函数   从某些源文件创建一个库
add_library(hello_library STATIC                        #静态库的名称为hello_library
    src/Hello.cpp
)
#生成  使用库的   可执行文件
add_executable(hello_binary 
    src/main.cpp
)

#使用target_link_libraries()函数告知编译器,找到库
target_link_libraries( hello_binary
    PRIVATE 
        hello_library
)

#库链接头文件
target_include_directories(hello_library    #两次链接头文件1. 生成共享库  2.生成可执行文件 
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

问题1:target_include_directories()函数 PUBLIC参数

https://zhuanlan.zhihu.com/p/82244559

问题2: 静态库与头文件的关系

将源文件编译成为静态库之后,

静态库文件相当于将函数接口留在了头文件head.h中,即函数声明。

用户看了头文件就知道如何使用静态库文件了,即如何使用函数。

因此最后只需要将main.c、head.h和库文件给用户即可。

用户就可以根据头文件中的接口情况,来知道库文件的功能 (具体怎么实现的他也不知道),

从而用户就可以使用库文件来完成自己的工作了(即执行main.c)

头文件的使用

编译静态库时,使用到头文件

编译其他目标文件时链接到静态库时,会使用到头文件。

问题3:静态库与动态库的区别

头文件stdio.h,其对应的是printf函数的声明,其库文件是printf函数实现的库文件,该库文件有C提供,它们是标准头、库文件,因此不需要指明路径和名称,且该库函数为动态库函数,当程序在运行过程中需要该库函数时,才会根据头文件找到相应的库函数并加载进入内存空间。

而静态库文件在载入内存之前就已经链接在了一起成为程序代码的一部分。

后续根据理解待补充。。。

问题4:静态库的优缺点

优点:

1. 发布程序的时候不需要提供对应的库(动态库需要);

2. 加载库的速度快(库函数就在代码区)。

缺点:

1. 库被打包到代码中,增加了代码的体积

2. 库一旦发生了改变,需要对整个程序进行重新编译。

静态库介绍:

https://blog.csdn.net/u013132758/article/details/94355795

https://blog.csdn.net/roy_xing/article/details/90372477?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

4. 创建并链接一个共享库 cmake思路

过程:(与静态库类似)

根据源文件创建共享库库,共享库链接头文件

生成可执行文件并链接共享库,共享库再链接头文件

add_library(hello_library SHARED   #将STATIC换成SHARED
    src/Hello.cpp
)
#可以给库取别名
add_library(hello::library ALIAS hello_library)

add_executable(hello_binary
    src/main.cpp
)

target_link_libraries( hello_binary
    PRIVATE 
        hello::library
        #hello_library    #两种方式都可以
)

target_include_directories(hello_library
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CMAKE学习记录(二)

    # 找到boost特定版本,以及需要的子模块,1.46.1为最低版本,REQUIRED强调必须找到该模块,否则编译失败;

    yzh
  • 静态库与动态库的那些事

    完成宏替换、文件引入、以及去除空行、注释等,为下一步的编译做准备。也就是对各种预处理命令进行处理,包括文件的包含、宏定义的扩展、条件编译的选择等。

    yzh
  • CAM 论文阅读

    重新审视《 Network in network》中提出的全局平均 池化层(global average pooling),并阐明了它是如何通过图片标签就能让卷...

    yzh
  • 在Substrate链上跑Solidity ERC20智能合约

    本实践案例中,我们首先会搭建和启动一条substrate链,再通过MetaMask这款著名的以太坊钱包浏览器插件,通过自定义RPC的方式,接入我们搭建好的sub...

    jasonruan
  • 在Substrate链上跑Solidity ERC20智能合约

    本实践案例中,我们首先会搭建和启动一条substrate链,再通过MetaMask这款著名的以太坊钱包浏览器插件,通过自定义RPC的方式,接入我们搭建好的sub...

    Tiny熊
  • 多态 接口重用,一种接口,多种实现 实例 ? 多态 静态方法 @staticmethod 在函数前边加修饰@ 为了 让这个方法和类没关系 @c...

    98k
  • tomcat启动分析 总结

    平凡的学生族
  • xmake vs cmake对比分析

    首先,不得不承认,cmake很强大,发展了这么多年,整个生态已经相当完善,功能也相当丰富,这点xmake目前是比不了的。

    ruki
  • 技术中台应用集成架构之移动微应用集成

    企业移动门户是企业现有应用与新应用的集成节点,使用户能够与人员、内容、应用和流程进行个性化的、安全的、单点式的互动交流。它也是一个集成业务中台、数据中台的使用者...

    yuanyi928
  • linux之shell

    相信很多同学都不陌生这个脚本,尤其是运维的同学,少不了吧。公司的运维系统就靠你了。shell是一种解释型的语言,我们写好了代码后,不需要编译,直接运行即可。平时...

    用户7657330

扫码关注云+社区

领取腾讯云代金券