CMake 学习笔记2

其他很好的总结

CMake教程系列-01-最小配置示例 - 知乎

 CMake 保姆级教程(上) | 爱编程的大丙

10-补充(完结)_哔哩哔哩_bilibili

1、基本关键字

SET命令的补充

(1)SET命令设置执行标准

#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)

(2) SET命令设置

set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

第一行:定义一个变量用于存储一个绝对路径
第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

    如果这个路径中的子目录不存在,会自动生成,无需自己手动创建

作者: 苏丙榅
链接: https://subingwen.cn/cmake/CMake-primer/

MESSAGE关键字

向终端输出用户自定义的信息

主要包含三种信息

  • SEND_ERROR,产生错误,生成过程被跳过
  • STATUS,输出前缀--的信息,MESSAGE(STATUS "this is binary dir")
  • FATAL_ERROR,立即终止cmake过程

ADD_EXECUTABLE关键字

生成可执行文件ADD_EXECUTABLE(hello main.cpp)

注意:工程名HELLO和生成的可执行文件hello是没有关系的

cmake 语法基本原则

变量使用${}方式取值,但是在IF控制语句中是直接使用变量名

指令(参数1 参数2 ...)参数使用括弧扩起,参数之间使用空格或分号分开

指令是大小写无关的,参数和变量是大小写相关的,但推荐指令全部大写

语法注意:

set(SRC_LIST main.cpp)可以加双引号 set(SRC_LIST "mian.cpp"),如果名字中有空格则建议加引号

ADD_EXECUTABLE(hello main)后缀可以不写,他会自动取找.c和.cpp但是最好写后缀防止有main这样的可执行文件等文件。

2、内部构建和外部构建

内部构建产生的文件特别多,不方便清理

外部构建会把产生的临时文件放在build下,不会对源文件有任何影响,推荐使用外部构建方式

mkdir build

cd build

cmake ..

make

3、工程配置 make install

可以用src文件夹放源码,可以在工程中添加脚本runhello.sh来调用hello二进制。将构建后的文件放到bin子目录

3.1 将生成文件放到bin

mkdir src

mv main.cpp src/

cd src

touch CMakeList.txt(src 下)

cd ..

touch CMakeList.txt(工程下)

==========================

CMakeList.txt(工程下)

PROJECT(HELLO)

ADD_SUBDIRECTORY(src bin)  #关联src

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)#安装文件

INSTALL(PROGRAMS runhello.sh DESTINATION bin)#安装脚本

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)#安装doc下的hello.txt

CMakeList.txt(src下)

ADD_EXECUTABLE( hello main.cpp)

==================

ADD_SUBDIRECTORY指令

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于当前工程添加存放源文件的子目录,并且可以指定中间二进制和目标二进制的存放位置

EXCLUDE_FROM_ALL函数是将写的目录从编译中排除,如程序中的example

ADD_SUBDIRECTORY(src bin)将src子目录加入工程并指定编译输出(包含编译中间结果)路径为bin目录。如果不进行bin目录指定,那么编译结果在build/src目录下

3.2安装COPYRIGHT和README

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)

FILES文件

DESTINATION:写绝对路径,可以写相对路径,相对路径实际路径是

${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>

CMAKE_INSTALL_PREFIX 默认在、usr/local/

cmake -DCMAKE_INSTALL_PREFIX=/usr 在cmake时候指定CMAKE_INSTALL_PREFIX变量的路径

3.3安装脚本runhello.sh

PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

说明:实际安装到的是/usr/local/bin

3.4安装doc中的hello.txt

一是通过在doc目录建立CMakeList.txt,通过install下的file

二是直接在工程目录通过

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

DIRECTORY后面连接的是所在source目录的相对路径

注意:abc/和abc有很大区别。不以/结尾,这个目录将被安装位目标路径下。以/结尾,这个目录中的内容将安装到目标路径

4、静态库和动态库构建

4.1

tree:

├── build
├── CMakeLists.txt
└── lib
    ├── CMakeLists.txt
    ├── hello.cpp
    └── hello.h

hello.h:

#ifndef HELLO_H
#define HELLO_Hvoid HelloFunc();#endif

hello.cpp

#include "hello.h"
#include <iostream>
void HelloFunc(){std::cout<<"hello world"<<std::endl;
}

CMakeLists.txt外层

PROJECT(HELLO)ADD_SUBDIRECTORY(lib bin)

CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARE ${LIBHELLO_SRC})#生成共享库

ADD_LIBRARY

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

hello:就是正常的库名,生成的名字会加上lib,最终文件是libhello.lib

SHARED,动态库,STATIC,静态库

${LIBHELLO_SRC}:源文件

4.2同时构建静态库和动态库

SET_TARGET_PROPERTIES

这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/308501.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake快速入门

文章目录 目的环境准备快速入门总结 目的 C/C的代码可以直接使用编译工具链进行编译&#xff0c;这种方式文件一多就不方便了。也可以编写 Makefile 然后使用 make 进行编译&#xff0c;当然写 Makefile 其实也挺繁琐。对于大型项目比较流行的是编写 CMakeLists.txt 然后使用 …

Hive的分区与排序

一、Hive分区 1.引入&#xff1a; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff…

2024最新在线工具箱网站系统源码

2024最新在线工具箱网站系统源码 下载地址: 2024最新在线工具箱网站系统源码-JXASP源码网https://www.jxasp.com/think-php/12489.html

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法一条SQL足以。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

OpenCV4.10使用形态运算提取水平线和垂直线

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 应用两个非常常见的形态运算符&#xff08;即膨胀和侵蚀&#xff09;&#xff0c;并创建自定义内核&#xff0c;以便在水平轴和垂直轴上提取直线。为此&#xff0c;您将使用以下 OpenCV 函数&#xff1a; erode()dilate…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;学习CSS就必须要学习选择器&#xff0c;在之前我们已经学习了基本选择器和复合选择器&#xff0c;但是还有几个选择器没有学习&#xff0c;这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

基于SSM强国有我党建网站

摘要 国家的繁荣富强与每一个人都息息相关密不可分并且关系密切&#xff0c;无论是从事最底层的工作的城市清洁工、工地上的民工、街边自己售卖自制商品进行生活的小商小贩&#xff1b;还是有一定的经济地位可以在电视中&#xff0c;采访中&#xff0c;各类访谈节目以及广大影…

C/C++ BM23 二叉树的前序遍历

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 自己在草稿纸上模拟这个遍历的过程比较简单&#xff0c;但是转移到代码上就突然会懵逼。这个在我之前学数据结构&#xff0c;做到这个实验的时候觉得很难理解。最近虽然已经入职了…

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处&#xff0c;为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…

C/C++基础----常量和基本数据类型

HelloWorld #include <iostream>using namespace std;int main() {// 打印cout << "Hello,World!" << endl;return 0; }c/c文件和关系 c和c是包含关系&#xff0c;c相当于是c的plus版本c的编译器也可以编译c语言c文件.cpp结尾.h为头文件.c为c语言…

unity android 打包

现在使用的unity版本hub不支持导入support&#xff0c;只能自己下载对应的支持 找到对应的sdk&#xff0c;ndk

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

探索GlusterFS:开源分布式文件系统

目录 引言 一、GlusterFS简介 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;GlusterFS特点 &#xff08;三&#xff09;GlusterFS术语 &#xff08;四&#xff09;GlusterFS工作流程 二、GlusterFs的卷类型 &#xff08;一&#xff09;卷类型 &…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、Linux的背景介绍UNIX发展的历史Linux发展历史开源官网发行版本DebianUbuntu红帽企业级LinuxCentOSFedoraKali Linux 三、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式L…

linux下动态库的运用

这里写目录标题 将头文件放入系统路径将.so动态库放入系统路径复制库文件&#xff1a;更新库缓存&#xff1a;验证安装&#xff1a; 完成 将头文件放入系统路径 先将include内容放入/usr/local/include下&#xff0c;这里可以先在/usr/local/include创建一个mkdir hpdf 文件夹…