前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cmake学习

cmake学习

原创
作者头像
yzh
修改2020-08-05 15:15:16
1.9K0
修改2020-08-05 15:15:16
举报

一、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
)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、cmake整体思路
    • cmake使用方法:
      • CMakeLists.txt通用设置:
        • 1. 单个cpp文件cmake思路
          • 2. 多个cpp文件 + 头文件 cmake思路
            • 3. 创建并链接一个静态库 cmake思路
              • 4. 创建并链接一个共享库 cmake思路
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档