Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CMake示例教程三

CMake示例教程三

作者头像
bear_fish
发布于 2018-09-14 01:50:52
发布于 2018-09-14 01:50:52
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1338348

本文主要内容如下:

1. 使用CMake将多个文件编译为可执行文件(包括cmake普通的set变量, file、aux_source_directory获取文件名三种方法)。
2. 多目录cmake使用。
3. 使用cmake生成静态,动态lib,以及lib和头文件的安装,以及安装到指定路径;lib版本的生成;如何卸载(实际上是删除)cmake安装的lib以及头文件。

1 多个文件编译为target

目录结构如下:

├── CMakeLists.txt

├── demo_3.cpp

├── demo3_h.h

└── demo3_main.cpp

demo3_h.h内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace demo3{
    void print_demo3();
}

demo_3.cpp代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "demo3_h.h"
#include <iostream>

namespace demo3{
    void print_demo3(){
        std::cout<<"this is demo3"<<std::endl;
    }
}

整个工程结构如下:

CMakeLists.txt 如下,使用三种方式设置文件读取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(VERSION 3.5)

project(demo3)

# This project show multi files build in cmake.

# first way: set source file by name
#set(SRC_LIST demo3_main.cpp demo_3.cpp)

# second way: use this get all the files in the current directory
# aux_source_directory(. SRC_LIST)

# third way: file glob
file(GLOB SRC_LIST ./*.cpp)

add_executable(demo3 ${SRC_LIST})

2. 多目录cmake使用

目录结构如下:

├── CMakeLists.txt

├── demo4_inc

│ ├── demo_4.cpp

│ └── demo4_h.h

└── demo4_main.cpp

CMakeLists.txt 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(VERSION 3.5)

project(demo4)

# This project show multi files build in cmake.
include_directories(demo4_inc)

aux_source_directory(. SRC_LIST)
message("src list is ${SRC_LIST}")
# if not add src in demo4_inc, then you will get "undefined reference to `demo4::print_demo4()"
aux_source_directory(demo4_inc SRC_LIST)
message("after add demo4_inc directory src list is ${SRC_LIST}")

add_executable(demo4 ${SRC_LIST})

编译输出如下:


3. 使用cmake生成静态,动态lib,以及lib和头文件的安装,以及安装到指定路径;lib版本的生成;如何卸载(实际上是删除)cmake安装的lib以及头文件

3.1 生成安装lib

项目结构如下:

├── CMakeLists.txt

├── demo_5.cpp

└── demo5_h.h

CMakeLists.txt 如下(生成static lib):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(VERSION 3.5)

project(demo5)

aux_source_directory(. SRC_LIST)

# create static lib
add_library(demo5 STATIC ${SRC_LIST})

# install lib and .h
install(TARGETS demo5 DESTINATION lib)
install(FILES demo5_h.h DESTINATION include)

如果要生成so lib:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# create dynamic lib
add_library(demo5_dynamic SHARED ${SRC_LIST})

ubuntu16下默认的安装在/usr/local下面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@xy:~/cmake_practice/cmake_build/build_demo5# make install
[100%] Built target demo5
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libdemo5.a
-- Installing: /usr/local/include/demo5_h.h
3.2 指定安装目录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake -DCMAKE_INSTALL_PREFIX=./  ../../cmake_tuorial/demo5/ 

输出如下:

3.3 卸载(本质上是删除)安装的lib

build目录下面有install_manifest.txt文件,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/local/lib/libdemo5.a
/usr/local/include/demo5_h.h

如下命令删除安装(https://stackoverflow.com/questions/41471620/cmake-support-make-uninstall (cited from)):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xargs rm < install_manifest.txt
# 
3.4 添加lib版本

下个如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 指定lib输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# 指定版本
set(DEMO5_VERSION_MAJOR 1)
set(DEMO5_VERSION_MINOR 1)
set(DEMO5_VERSION_PATCH 1)
set(DEMO5_VERSION ${DEMO5_VERSION_MAJOR}.${DEMO5_VERSION_MINOR}.${DEMO5_VERSION_PATCH})

aux_source_directory(. SRC_LIST)

add_library(demo5 SHARED ${SRC_LIST})

set_target_properties(demo5 PROPERTIES VERSION ${DEMO5_VERSION}
        SOVERSION ${DEMO5_VERSION_MAJOR}
        )

编译输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@xy:~/cmake_practice/cmake_build/build_demo5# ll -th lib/
total 36K
-rwxr-xr-x 1 root root 8.6K May 20 09:51 libdemo5.so.1.1.1*
drwxr-xr-x 2 root root 4.0K May 20 09:51 ./
lrwxrwxrwx 1 root root   13 May 20 09:51 libdemo5.so -> libdemo5.so.1*
lrwxrwxrwx 1 root root   17 May 20 09:51 libdemo5.so.1 -> libdemo5.so.1.1.1*
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法部署 | 万字长文带你从C++案例一步一步实操cmake(起飞系列)
你或许听过好几种Make工具,例如GNU Make ,QT的qmake ,微软的MS nmake,BSD Make(pmake),Makepp,等等。这些Make工具遵循着不同的规范和标准,所执行的Makefile格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次Makefile,这将是一件让人抓狂的工作。
集智书童公众号
2021/07/30
1.5K0
CMAKE入门实战
最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧,原作者github地址:https://github.com/wzpan/cmake-demo。
公众号guangcity
2019/09/20
1.6K0
CMAKE入门实战
关于 CMake 使用,看这一篇可能就够了
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
字节流动
2021/10/18
6.1K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
3K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
cmake简单使用教程
CMakeLists.txt: # ------------------project目录---------------------- # # |-- bin # |-- lib # |-- main.c # |-- testFunc.c # |-- testFunc.h # |-- CMakeLists.txt # |-- hardware # | |-- beep.c # | |-- beep.h # | |-- server.c # |
小锋学长生活大爆炸
2021/02/04
1.1K0
cmake简单使用教程
CMake学习笔记
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!
CtrlX
2023/02/06
2.1K0
CMAKE使用手记
首先感谢那位叫“任麒麟”的网友整理的PDF,有心了。 我也忘了哪里下载的,不过确实挺全的。
看、未来
2021/10/09
5690
Cmake学习总结(三)
大家好,在上一篇文Cmake文章里面,我们同样在文章的最后面留了一个问题实现,就是把源文件放到src目录下,把头文件放到include目录下去,这样也比较符合别人和自己日后去配置工程(一看到这两个目就能知道啥意思了,清晰明了),同时在linux环境下生成的elf文件放到bin目录下;不过在文章发出去了几天,后面有网友又有提出了一些新的需求:
用户6280468
2022/03/21
5190
Cmake学习总结(三)
CMake学习笔记(二)——CMake语法
剑影啸清寒
2018/01/02
6K0
C++搭建集群聊天室(四):工程统帅神器 Cmake,我爱死它了
2、右击 cmake-tools,选择 extension settings,打开,填写:
看、未来
2021/09/18
3910
Android NDK 开发 | CMake 使用手册 - 初见篇
之前写过一篇 《[-NDK 导引篇 -] 在NDK开发之前你应知道的东西》 介绍了在进入 NDK 学习之前,如何摆正自己的角色。时隔两年,NDK 系列文章开始填坑,在上一篇 《 NDK 是什么 | FFmpeg 5.0 编译 so 库》 中,介绍了 NDK 的概念,以及其作用。
张风捷特烈
2022/09/20
1.4K0
Android NDK 开发 | CMake 使用手册 - 初见篇
CMakeLists.txt 语法介绍与实例演练
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
全栈程序员站长
2022/06/24
2.4K0
CMakeLists.txt 语法介绍与实例演练
Linux下CMake简明教程
CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。
全栈程序员站长
2022/09/01
2.1K0
cmake快速入门「建议收藏」
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。
全栈程序员站长
2022/09/13
1.3K0
cmake快速入门「建议收藏」
Cmake学习总结(二)
大家好,上次给大家分享了第一篇 cmake 文章:cmake学习总结(一),今天继续给大家分享cmake。那么废话就不多说,开始内容分享。
用户6280468
2022/03/21
2870
【C++】基础:代码编译与构建工具介绍
C++ 编译与构建工具主要用于将 C++ 源代码转换为可执行程序。它们可以分为以下几类:
DevFrank
2024/07/24
4240
CMake入门实战——多个源文件
上面的例子只有单个源文件。现在假如把 power 函数单独写进一个名为 MathFunctions.c 的源文件里,使得这个工程变成如下的形式:
AI异构
2020/07/29
2.1K0
cmake终极奥义
上期makefile终极奥义反响不错,有粉丝提出有没有cmake终极奥义,那么她来了。已构建项目,地址为:
DeROy
2021/03/12
1.4K0
cmake终极奥义
Cmake的使用
有了Cmake以后,只需要编写一个CmakeLists文件就可以对应将一个C++工程不通操作系统
全栈程序员站长
2022/09/22
1.5K0
Cmake的使用
CMake使用总结
CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。
bear_fish
2018/09/19
1.9K0
相关推荐
算法部署 | 万字长文带你从C++案例一步一步实操cmake(起飞系列)
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验