cmake笔记 编译与链接

news2024/11/27 22:35:18

文章目录

  • 概述
  • 编译最简单的hello world
  • 编译工程化的helloWorld
  • 更工程化的Hello World: 构建静态库与动态库
  • 如何使用外部共享库和头文件
  • 其他有用的cmake命令
    • include_directories
    • find_package
    • ` file(GLOB variable [RELATIVE path] [globbing expressions]...)`
  • windows 下 C++开发中的cmake
  • 问题

概述

本文为《cmake practice》的个人笔记。
注意,如果仅仅使用qt编程的话,没必要使用cmake,因为qmake已经足够专业。

cmake的正常使用顺序:

  1. 找一个合适的位置,mkdir build & cd build (也就是 out-of-source build)
  2. cmake … (…代表的是父目录,也就是cmakelists所在的路径)
  3. make

注意,清理工程的命令为: make clean

编译最简单的hello world

工程结构:
在这里插入图片描述

CMakeLists.txt中的内容:

PROJECT(HELLO) 
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
  • 注意SRC_LIST 外面需要加上${}。这是cmake的语法,变量会需要这样去取值。但是后续需要注意的是,在IF语句中会直接使用变量名。

在进行常规cmake和make操作后,在build文件夹中就会出现目标文件 hello.o,可以直接用于运行。

如果想要看到具体的make信息,可以输入 make VERBOSE=1


1. PROJECT(projectname [CXX] [C] [Java])
用于定义工程名称,默认情况下支持所有语言。该指令运行的同时,隐式地定义了两个cmake变量,即<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。注意,通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即
/backup/cmake/t1而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build。

2. SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
显式定义变量

3. MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
向终端输出用户定义的信息:

  • SEND_ERROR,产生错误,生成过程被跳过;
  • SATUS,输出前缀为—的信息;
  • FATAL_ERROR,立即终止所有 cmake 过程

4. ADD_EXECUTABLE(hello ${SRC_LIST})"
生成一个文件名为 hello 的可执行文件
相关的源文件是 SRC_LIST 中定义的源文件列表。

编译工程化的helloWorld

在这里插入图片描述

新建src文件夹,在src文件夹中放入main.c文件,且新建一个cmakelists,内容是:ADD_EXECUTABLE(hello main.c)
而后,跳出src文件夹,再新建一个cmakelists,内容是:
PROJECT(HELLO) ADD_SUBDIRECTORY(src bin)
我们就可以惊奇的发现,编译后的hello文件竟然在build/bin文件夹下。
而能够实现这种惊奇的命令就是: ADD_SUBDIRECTORY


  1. ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    这个命令用于向当前工程添加存放源代码的子目录,且可以指定中间二进制以及目标二进制存放的位置。
    所谓 EXECLUDE_FROM_ALL参数的含义是将该目录从编译过程中排除掉,举个例子,工程里的example,往往需要工程构建完后,再进到example目录里面单独编译。
    ADD_SUBDIRECTORY(src bin)做的事情就是,在编译时将src重命名为bin,并将中间结果与目标二进制放到bin里面。

此时的目录结构为:在这里插入图片描述


实际上,我们还可以通过SET指令重新定义 EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH 来仅仅指定目标二进制输出的位置,注意,此时不包含编译生成的中间文件。
具体为:

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

更工程化的Hello World: 构建静态库与动态库

如何使用外部共享库和头文件

其他有用的cmake命令

include_directories

find_package

我们可以通过find_package引入其他cmake编译安装的库。

file(GLOB variable [RELATIVE path] [globbing expressions]...)

file(GLOB variable [RELATIVE path] [globbing expressions]...)
file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)

GLOB选项将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。
文件名查询表达式与正则表达式类似,只不过更加简单。
如果为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径

文件名查询表达式的例子有:

*.cxx - 匹配所有扩展名为cxx的文件。
*.vt? - 匹配所有扩展名是vta,…,vtz的文件。
f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。

GLOB_RECURSE选项将会生成一个类似于通常的GLOB选项的list,只是它会寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件。

参考文献:https://www.cnblogs.com/coderfenghc/archive/2012/07/08/2581734.html

windows 下 C++开发中的cmake

通常来说,在windows开发的时候,cmakelist写完了生成sln。
往往还是会选择用visual studio 而不是 visual studio code 来进行开发。
调用第三方库的时候,一定要问清楚自己以下几点:

  1. 是不是正确include了?
  2. 是不是正确链接 lib库了?
  3. dll有没有放到跟exe同级的目录下,或者直接编到系统库上?
  4. 到底是x86还是x64,有没有搞错这里。

问题

  1. cmakelists如何同时链接debug库和release库?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Maven基础】IDEA环境使用

第一节 创建父工程 1、创建 Project 2、开启自动导入 创建 Project 后&#xff0c;IDEA 会自动弹出下面提示&#xff0c;我们选择**『Enable Auto-Import』**&#xff0c;意思是启用自动导入。 这个自动导入一定要开启&#xff0c;因为 Project、Module 新创建或 pom.xml 每次…

微服务的相关概念及知识

微服务概念 微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出&#xff0c;他们定义了微服务是由单一应用程序构成的小服务&#xff0c;拥有自己的进程与轻量化处理&#xff0c;服务依业务功能设计&#xff0c;以全自动的方式部署&#xff0c;与其他服务使用HT…

6-zookeeper-hadoop-ha原理简述-fail

6-zookeeper-hadoop-ha故障转移机制&#xff0c;原理简述: HA概述&#xff08;2.X版本架构&#xff09;。 1&#xff09;、HA&#xff08;High available&#xff09;&#xff0c;即高可用&#xff08;7*24小时不间断服务。&#xff09; 1、zookeeper协调服务&#xff0c;通…

jsp+ssm计算机毕业设计毕业设计管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

Qt扫盲-QScrollBar理论总结

QScrollBar理论总结1. 简述2. 滚动条组成3. 常用设置5. 信号6. 键盘功能1. 简述 QScrollBar其实就是一个滚动条控件&#xff0c;它使用户能够访问大于用于显示文档的小组件的文档部分。它提供了用户在文档中的当前位置以及可见的文档量的可视指示。滚动条通常配备其他控件&…

什么是MOS管的米勒效应

在说MOS管的米勒效应之前我们先看下示波器测量的这个波形: 这个波形其实就是这个MOS管开关电路的波形&#xff0c;探头1这个黄色的测量的是MOS管的栅极&#xff0c;探头2这个蓝色的测量的是MOS管漏极 大家有没有发现这个黄色的波形在上升的过程中出现了一个平台&#xff0c;其实…

一年半经验如何准备前端面试

typeof NaN 的结果是什么&#xff1f; NaN 指“不是一个数字”&#xff08;not a number&#xff09;&#xff0c;NaN 是一个“警戒值”&#xff08;sentinel value&#xff0c;有特殊用途的常规值&#xff09;&#xff0c;用于指出数字类型中的错误情况&#xff0c;即“执行数…

如何快速拥有好的测试idea

如果接手任意一个测试任务&#xff0c;如何开始测试以及怎么快速的形成测试点呢?其实也是有一套小套路的。大概整理了下&#xff0c;可以从6个方面来考虑入手。 1.项目 快速了解项目背景、信息对象、项目风险、测试资料、债务、交流、语境分析、交付品、工具。 项目的提出动机…

0~9岁|一文讲清楚精细动作有多重要

人都有两宝&#xff1a;“双手和大脑”。 在我们的脑中枢神经内&#xff0c;有一部分专门掌管手部动作&#xff0c;手部动作越精细&#xff0c;与之对应的大脑神经元也就越发达。作为儿童智能的重要组成部分&#xff0c;精细动作还是衡量儿童神经系统发育的一个重要指标。 一、…

C++:继承、模板、CRTP:谈谈C++多态设计模式(三):函数模板

1&#xff1a;模板的概念 C中不止有 面向对象编程思想&#xff0c;还要泛型编程思想。而泛型编程思想的核心就是 模板 模板的建立大大提搞了复用行&#xff0c;C中的模板包括 &#xff1a;函数模板和类模板。 2&#xff1a;函数模板基本语法 函数模板 概念&#xff1a; 建立…

细粒度图像分类论文研读-2018

文章目录Object-Part Attention Model for Fine-grained Image Classification&#xff08;by localization- classification subnetwork&#xff09;AbstractIntroductionObject- Part Attention ModelObject- Part Spatial Constraint ModelOur OPAM ApproachObject-level At…

Flink从入门到放弃—Stream API—clean()方法

文章目录导航clean()案例贴上源码导航 涉及到文章&#xff1a; Flink从入门到放弃—Stream API—Join实现&#xff08;即多流操作&#xff09; Flink从入门到放弃—Stream API—常用算子&#xff08;map和flatMap&#xff09; Flink从入门到放弃—Stream API—常用算子(filter…

讲解Redis的主从复制

Redis 主从复制1 主从复制2 作用3 主从复制架构图4 搭建主从复制5 使用规则1 主从复制 主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据 无法解决: 1.master节点出现故障的自动故障转移 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到…

数据挖掘的步骤有哪些?

所谓数据挖掘就是从海量的数据中&#xff0c;找到隐藏在数据里有价值的信息。因为这个数据是隐式的&#xff0c;因此想要挖掘出来并不简单。那么&#xff0c;如何进行数据挖掘呢&#xff1f;数据挖掘的步骤有哪些呢&#xff1f;一般来讲&#xff0c;数据挖掘需要经历数据收集、…

openEuler 倡议建立 eBPF 软件发布标准

eBPF 是一个能够在内核运行沙箱程序的技术&#xff0c;提供了一种在内核事件和用户程序事件发生时安全注入代码的机制&#xff0c;使得非内核开发人员也可以对内核进行控制。随着内核的发展&#xff0c;eBPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等&#xff0…

软件测试之测试用例评审

一、评审目的 一般来说&#xff0c;参加测试用例评审的人员包括对应项目的产品人员、设计人员、开发人员和测试人员。 图1-1 测试用例评审相关人员 测试用例评审会议的发起者一般是测试人员&#xff0c;既然我们是发起者&#xff0c;那我们发起这个会议的目的是什么呢&#x…

【Java开发】 Spring 11 :Spring Boot 配置 Web 运行参数并部署至服务器

Spring Boot 项目开发结束后的工作便是运维&#xff0c;简单来说需要配置 Web 运行参数和项目部署两大工作&#xff0c;本文将尽可能详细地给大家讲全&#xff01; 目录 1 定制 Web 容器运行参数 1.1 运行参数介绍 1.2 项目搭建 ① 通过 IDEA Spring Initializr 创建项目 …

使用nginx代理服务器上的docker容器接口

假如项目通过自动化部署在了docker容器里面&#xff1a;教程在这里vue使用dockernodenginxlinux自动化部署_1024小神的博客-CSDN博客 怎么将nginx通过域名绑定到这个容器呢&#xff1f; 例如我们将一个二级域名绑定second.1024shen.com/#/ 到我们的服务 我们需要先在域名解析…

阿里P8专家整理的面试秘籍,我看了三个月,成功入职京东,税前30K

入职京东&#xff0c;月薪30K 今年三月份的时候&#xff0c;我从上一家外包公司裸辞。那时正值疫情期间&#xff0c;实在受不了公司的压迫&#xff0c;毅然决然的选择了离职。 卧薪尝胆三个月后&#xff0c;才收到京东的offer&#xff0c;谈到了30k的月薪顺利入职。 本来那时…

DPDK源码分析之l2fwd

什么是L2转发 2层转发&#xff0c;即对应OSI模型中的数据链路层&#xff0c;该层以Mac帧进行传输&#xff0c;运行在2层的比较有代表性的设备就是交换机了。 当交换机收到数据时&#xff0c;它会检查它的目的MAC地址&#xff0c;然后把数据从目的主机所在的接口转发出去。 交…