C++编程(五)--- Cmake详解&Makefile详解

2023-05-16

     C/C++程序员肯定离不开Makefile和Cmake,因为如果对这两个工具不熟悉,那么你就不是一个合格的C/C++程序员。本文对Makefile和Cmake,及它们的使用进行了详细的介绍,本文的目录如下:

一、Makefile详解

    1.1 Makefile语法
    1.2 Makefile示例

二、Cmake详解

    2.1 Cmake语法
    2.2 Cmake示例


一、Makefile详解

    Makefile描述了整个工程的编译、连接等规则,makefile定义了一些列规则来指定,哪些文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何产生我们想要的可执行文件。使用Makefile,整个工程都可以完全自动化编译。而且Makefile 可以有效的减少编译和连接的程序,只编译和连接那些修改的文件。

1.1  Makefile语法

1.1.1
      Makefile包含了五个重要的东西:显示规则、隐晦规则、变量定义、文件指示和注释。
          1. 显示规则:显示规则说明了,如何生成一个或多个目标。这是由Makefile指出要生成的文件和文件依赖的文件。
          2. 隐晦规则:基于Makefile的自动推导功能
          3. 变量的定义:一般是字符串
          4. 文件指示:一般是在Makefile中引用另外一个makefile文件;根据某些规则指定Makefile中有效的部分;多行
          5. 注释:#指示注释

      Makefile有三个非常重要的变量:$@、$^、$#,它们的含义如下:
          $@    ---目标文件
          $^      ---所有依赖文件
          $<      ---第一个依赖文件
          .PHONY  ---伪目标文件

      Makefile的执行过程如下:

          1. 在当前目录下寻找Makefile或makefile。
          2. 找到第一个文件中的第一个目标文件,和目标文件依赖的.o文件。
          3. 如果.o文件不存在,或是后面.o文件比target文件更新,那么它就会执行后面的语句来生成这个文件。
          4. 最后makefile会根据.o文件依赖的.h和.c文件生成.o文件。

1.1.2

      注意:
           1. clean不要放在target前面。
           2. -rm edit  $(objects)  忽略某些文件的问题。
           3. Makefile中的命令,必须以[Tab]键分割。文件之间最好使用空格分割。
           4. -I 或 --include-dir 参数,那么make就会在这些目录下去寻找。
           5. -L 相当于load lib dir, -lfb303  相当于libfb303.so

1.1.3 g++编译命令:
           1. -g  相当于debug
           2. -Wall 相当于忽略warnning
           3. -O1~3 相当于优化级别
           4. -lpthread多线程
           5. -j8 多线程编译
           6. -D相当于宏定义,-D_YUQIANG,那么#ifdef _YUQIANG就是True的。

1.2  Makefile示例

CC = gcc
RM = rm

CFLAGS += -D _YUQIANG
TARGETS := myapp
all:$(TARGETS)

$(TARGETS):main.c
$(CC) $(CFLAGS) $^ -o $@

clean:
-$(RM) -f *.o
-$(RM) -f $(TARGETS)


二、CMake详解

   CMake是一个夸平台的安装(编译)工具,可以简单的语句描述所有平台的安装(编译过程)。它能输出各种各样的makefile或者project文件,能测试编译器所支持的c++特性,类似UNIX下的automake。

2.1 Cmake语法

     1.  project name 

          PROJECT( project name )

     2. 头文件路径
          INCLUDE_DIRECTORIES( include )

     3. 设置环境变量的值
          SET( TEST_DIR ${DIR_SRCS})

     4. 设置外部库
          SET(LIBRARIES libm.so)

     5. 设置可执行文件路径
          ADD_EXECUTABLE( ../bin/bin ${TEST_DIR})

     6. 设置链接库
          TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})

     7. 设置代码子目录
         ADD_SUBDIRECTORY

2.2 CMake示例

#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES}


参考文献:
1.  Linux  Makefile教程: http://blog.csdn.net/liang13664759/article/details/1771246
2. CMake 学习二: http://blog.sina.com.cn/s/blog_53b7ddf00101mjp5.html
3. CMake基本用法: http://blog.sina.com.cn/s/blog_68409a2801019bm7.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++编程(五)--- Cmake详解&Makefile详解 的相关文章

  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • 将文件夹中结构化的预构建文件集添加到 android out 文件夹

    我为arm编译了glibc 这与Android glibc或bionic C不同 因为我编译的glibc环境将有助于提供更多api 现在我可以在 Android 运行时将 glibc 环境复制到 system 文件夹中 并且在执行 chro
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • Readelf 报告程序是共享库而不是可执行文件

    使用独立的 Android NDK r10e 工具链 使用 toolchain x86 clang3 6 开关构建 出现这种奇怪的行为 交叉编译的环境变量已设置在运行makefile之前 SYSROOT指向Android工具链位置 CXX等
  • grpc找不到protobuf库

    我检查了 grpc 安装并完成了构建和安装 现在当我尝试 find package gRPC CONFIG REQUIRED I get CMake Error at CMakeLists txt 15 find package Found
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • 错误:安装 ffi 时出错:错误:无法构建 gem 本机扩展

    我在 Mac 64 位系统中遇到此错误 并且机器上安装了 xcode Building native extensions This could take a while ERROR Error installing ffi ERROR F
  • 强制 Makefile 中依赖项的顺序

    我有一个 Makefile 我想并行使用它来编译一组单独的程序 它看起来像这样 compileall program1 program2 program3 echo Compilation completed program1 progra
  • 为dlib创建共享库

    按照说明使用 cmake 编译 dlib here http dlib net compile html 生成静态 dlib 库 cd examples mkdir build cd build cmake cmake build conf
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 使用 GNU make “从源代码树中”构建 C 程序

    我想使用 GNU make 工具为我的微控制器构建一个 C 项目 我想以一种干净的方式来做这件事 这样我的源代码在构建后就不会被目标文件和其他东西弄乱 想象一下我有一个名为 myProject 的项目文件夹 其中有两个文件夹 myProje
  • 构建 gradle 系统应用程序作为 AOSP 构建的一部分

    我有一个基于 AOSP 的自定义 ROM 并且正在开发一个系统应用程序 该应用程序在 ROM 构建期间打包 就像任何其他系统应用程序一样 是否可以将此应用程序切换为 gradle 样式应用程序 并在 AOSP 构建期间使用 gradle 构
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • CMake:如何将 .def 文件添加到 Visual Studio 项目过滤器?

    如何将 def 文件添加到 Visual Studio 项目过滤器 filters文件 Visual Studio 使用 def 文件 CMake代码 set a src a cpp a def add library a SHARED a
  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • 用于发布和调试目标的 Makefile

    我正在尝试构建一个 Makefile 它可以通过指定目标而不是变量 例如make debug 1 不太好 我这里有一个精简的简化示例 它模拟了我想要实现的目标 ifdef debug BINARY my binary debug MODUL
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法

随机推荐

  • html转微信公众号,通过htmlparse动态抓取微信公众号的文章

    真的是很久没有更新我的博客了 xff0c 刚开始 xff0c 我还真的不知道爬虫是什么东西 xff0c 但是由于项目需要 xff0c 老板要我做个简单的爬虫 xff0c 就是去人家的微信公众号去把里面的文章动态的抓取下来 xff0c 当听到
  • 超声波测距传感器初识之HC-SR04

    1 HC SR04初识 HC SR04超声波测距模块可提供2cm 400cm的非接触式距离感测功能 xff0c 测距精度可达高到3mm xff1b 模块包括超声波发射器 接收器和控制电路 其基本工作原理采用IO口TRIG触发测距 xff0c
  • 2.3 使用ARDUINO控制MC20进行GPRS的TCP通讯

    需要准备的硬件 MC20开发板 1个 https item taobao com item htm id 61 562661881042GSM GPRS天线 1根 https item taobao com item htm id 61 5
  • ubuntu16.04下编译ceres-solver

    一 编译环境 ubuntu16 04 二 准备工作之安装必要的库 2 1安装cmake sudo apt get install cmake 2 2 安装google glog 43 gflags sudo apt get install
  • 四轴飞行器1.5 各种PID对比分析及选择

    原创文章 xff0c 欢迎转载 xff0c 转载请注明出处 这篇文章主要介绍我对PID的理解 xff0c 以及选择PID算法的过程 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频 xff1a 介绍在后面 地址
  • micropython安装ros_ROS2 树莓派SBC镜像安装

    下载并安装Ubuntu映像文件 TurtleBot3 1 转到Ubuntu旧版本 2 在远程PC上下载ubuntu 18 04 3 preinstalled server arm64 43 raspi3 img xz 3 将Ubuntu映像
  • Error "Client wants topic A to have B, but our version has C. Dropping connection."

    ROS problem 出现这个问题的原因是话题上的消息类型和订阅节点指定的消息类型不匹配 转载于 https www cnblogs com lvchaoshun p 7811123 html
  • unity利用A*算法进行2D寻路

    找了份新工作之后 xff0c 忙的要死 xff0c 都没时间鼓捣博客了 xff0c 深深的感受到资本家的剥削 xff0c 端午节连粽子都没有 xff0c 每天下班累得跟条咸鱼一样 可能就是 刚好最近忙里偷闲 xff0c 就来写写unity在
  • 工信部划分数据中心规模等级

    C114讯 2013年1月14日上午消息 为落实 国务院关于加快培育和发展战略性新兴产业的决定 xff0c 满足社会 信息化 水平不断提高的要求 xff0c 促进我国数据中心 xff0c 特别是大型数据中心的合理布局和健康发展 xff0c
  • VS2010 error RC2135: file not found

    VS2010 C 43 43 win32 DLL 工程 xff0c 添加 rc 文件 xff0c 编辑 String Table 默认情况下英文版本的 rc 文件能够顺序编译通过 xff0c 为了让工程支持多语言 xff0c 将字符串修改为
  • mavlink协议移植问题

    mavlink协议移植问题 mavlink源代码是一个代码库 xff0c 使用的时候只需要将mavlink h头文件包含到工程项目中即可 mavlink通信协议是无状态的连接 xff0c 一般采用心跳消息跟踪系统是否存在 请确保每60 30
  • 光流传感器 定位精度_光流传感器其它方面的应用

    光流传感器可以通过在一定的时间内拍摄两张不同的照片 进而计算出物体运动的速度 光流是一种简单实用的图像运动表达方式 通常定义为一个图像序列中的图像亮度模式的表观运动 光流法检测运动物体的基本原理是 xff1a 给图像的每一个像素点赋予一个速
  • 6.28-机器人模拟器Gazebo基础

    gazebo基础学习 前言 在算法人员开发出可以真机使用的算法之前进行仿真学习机器人物理仿真器的基本使用 xff0c 包括创建场景 xff0c 制作ROS控制接口等 目录 gazebo基础学习 前言 目录 参考 学习记录 基础 安装gaze
  • Poco C++库网络模块例子解析2-------HttpServer

    下面程序取自 Poco 库的Net模块例子 HTTPServer 下面开始解析代码 include 34 Poco Net HTTPServer h 34 继承自TCPServer 实现了一个完整的HTTP多线程服务器 include 34
  • 【0928 | Day 39】事务(精讲)

    目录 一 事务 1 mysql如何控制事务 xff1f 2 默认事务开启的作用是什么 xff1f 3 事务的其他打开方式 xff1f 二 事物的四大特性 一 事务 在mysql中 xff0c 事务其实是一个最小的不可分割的工作单元 xff0
  • Unity项目 - DeathtrapDungeon死亡地牢

    目录 游戏原型项目演示绘图资源代码实现注意事项技术探讨参考来源 游戏原型 死亡地牢是一款 2D Roguelike 的地牢冒险游戏 手握利刃 xff0c 斩杀怪物 xff0c 在凶险的地牢内生存下去 但注意 xff0c 敌人也并非善茬 xf
  • Unity - 存读档机制简析

    本文旨在于简要分析Unity中的两种存档机制 xff0c 即 xff1a PlayerPrefs数据持久化方法及Serialization数据序列化方法 较比于源项目 xff0c 我另加了JSON方法 XML方法等及一些Unity设置 xf
  • Windows 无法安装到所选位置。错误:0x80300001

    Windows 无法安装到所选位置 错误 xff1a 0x80300001 这里遇到的情况是这样的 xff0c iDrac安装windows 2008 R2 xff0c 一开始映射 windows 2008 R2系统镜像 xff0c 后来
  • 【udacity】机器学习-2模型验证

    Evernote Export 1 模型的评估与验证简介 机器学习通常是大量传入数据 xff0c 然后会有一些关于数据的决策 想法和摘要 2 模型评估 评估模型使用的是各种数据分析的方法 xff0c 至少需要使用python编程和一些统计学
  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的