CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY

2023-11-17

在上一章里面,我们用cmake做了一个最简单的项目,这一节我们尝试一写比较常见的cmake配置。

这次我们构建如下的目录结构

其中int_plus.h的代码如下:

int int_plus(const int a, const int b);

int_plus.cc的代码如下:

#include "int_plus.h"

int int_plus(const int a, const int b){
    return a + b;
}

main函数的代码如下:

#include <iostream>
#include <vector>
#include <string.h>
#include "int_plus.h"

int main()
{
    int a = 3;
    int b = 4;
    int c = int_plus(a,b);
    std::cout << c << std::endl;
    return 0;
}

makefiles.txt的内容如下:

# cmake 最低版本需求
cmake_minimum_required(VERSION 3.13)

# 工程名称
project(cmake_study1)

# 设置
set(CMAKE_CXX_STANDARD 11)


#3.head file path,头文件目录
include_directories(src/include)
AUX_SOURCE_DIRECTORY(src/include INCLUDE)

# 编译源码生成目标
add_executable(cmake_study src/main.cc ${INCLUDE})

add_executable配置

该配置指定了这次要编译的文件有哪些,以及编译后的可执行文件名是什么。因为编译时,编译器不会到那些文件需要,那些文件不需要,所以这里需要把所有的要编译的文件全部写进去(无论这个代码是否和main同一路径),可以以单个文件或者路径的形式写入,如果没有写而且main函数最终依赖该函数,则会报错。编译以后的可执行文件入口就是main函数。

以上面的例子来说,如果把add_executable 中的 ${INCLUDE}去掉,则会报错:

symbol(s) not found for architecture 

include_directories(src/include) 

这次新增了include_directories(src/include)  和 AUX_SOURCE_DIRECTORY(src DIR_SRCS)

其中

include_directories(src/include) 

的作用是头文件的路径,例如在上面的例子中,main函数用到了./include/int_plus.h(以main所在目为根目录),如果没有include_directories(src/include) 那么在main中就要写

#include "include/int_plus.h"

当然,include_directories是可以包含多个文件夹的。如果有一个新的文件夹util 也被依赖,可以额外再加一个

include_directories(src/util) 

AUX_SOURCE_DIRECTORY

AUX_SOURCE_DIRECTORY(src/include INCLUDE)的作用是添加源码路径。在add_executable 我们需要指定要编译的文件,当需要编译的文件特别多时,一个一个写就非常麻烦了,所以需要指定一个路径,视为源码路径。

在上面的例子中,如果没有AUX_SOURCE_DIRECTORY(src/include INCLUDE) 这一句的话,在编译时会报错

Undefined symbols for architecture x86_64:
  "int_plus(int, int)", referenced from:
      _main in main.cc.o

这是因为链接过程中,需要用到int_plus.cc的编译文件,但是add_executable中没有添加int_plus.cc 所以没有对其进行编译,链接时也就找不到该文件了。

同样的,如果我们有多个路径的需要加入,也可以配置多个AUX_SOURCE_DIRECTORY,例如上面的例子中,我们可以写成

AUX_SOURCE_DIRECTORY(src/include INCLUDE)

AUX_SOURCE_DIRECTORY(src  SRC)

# 编译源码生成目标
add_executable(cmake_study  ${SRC}  ${INCLUDE})

应该注意两点:

1. AUX_SOURCE_DIRECTORY 只包含该目录下的以及文件,而不包含递归的子文件夹。

2.  AUX_SOURCE_DIRECTORY(src/include INCLUDE ) 并不是把路径src/include 替换成了INCLUDE,而是在src/include路径中找到了所有非路径的文件,赋给了INCLUDE。如下代码可以证明

cmake_minimum_required(VERSION 3.13)

# 工程名称
project(cmake_study1)

# 设置
set(CMAKE_CXX_STANDARD 11)

#3.head file path,头文件目录
include_directories(src/include)
include_directories(src)
AUX_SOURCE_DIRECTORY(src/include INCLUDE)
message(${INCLUDE})

输出  src/include/int_plus.cc

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

CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY 的相关文章

随机推荐

  • 【yolov7系列二】正负样本分配策略

    本文主要就yolov7的正负样本筛选策略 并与yolov5 yolov6进行比对 首先接着上一篇yolov7系列一 网络整体结构 填几个小坑 希望对大家没有造成困扰 如 E ELAN层 在cat后需要要conv层做特征融合 还有SPPCSP
  • python virtualenv

    文章目录 powershell 参考文章 https www cnblogs com freely p 8022923 html https blog csdn net u012206617 article details 90294421
  • Inorder Successor in BST

    Given a binary search tree and a node in it find the in order successor of that node in the BST Note If the given node h
  • UNI-APP_APP(webview)集成X5内核

    官方文档 https uniapp dcloud net cn tutorial app android x5 html 腾讯TBS x5内核仅支持Android平台 iOS只能使用自带的WKWebview 打开项目的manifest js
  • Linux awk 命令

    AWK是一种处理文本文件的语言 是一个强大的文本分析工具 之所以叫AWK是因为其取了三位创始人 Alfred Aho Peter Weinberger 和 Brian Kernighan 的Family Name的首字符 语法 awk 选项
  • Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

    文章目录 问题描述 问题结决 思考 相关文章 在直接将CANopenSTM32的示例工程直接移植到Keil环境下 如果移植工程未实现printf函数重定向 则要注释掉log printf下面的printf函数 使日志打印失效 Printf
  • SQL注入之盲注

    SQL注入之盲注 前言 一 盲注分类 二 具体解析 1 基于布尔的sql盲注 首先要先了解一下sql注入截取字符串常用的函数 1 mid 函数 2 substr 函数 3 left 函数 具体注入方法 2 基于时间的SQL盲注 3 基于报错
  • Java实验3与第五周总结

    1 已知字符串 this is a test of java 按要求执行以下操作 要求源代码 结果截图 统计该字符串中字母s出现的次数 统计该字符串中子串 is 出现的次数 统计该字符串中单词 is 出现的次数 实现该字符串的倒序输出 pu
  • BT5, depends* but it is not going to be installed 解决方法

    apt get install 任何包都缺少依赖项 执行以下命令 apt get f install 然后在 apt get install package package 你要安装的包 比如我安装的open vm tools 就成功了 后
  • VSCode代码自动补全(html标签、style样式、css属性及值)

    转自 传送门 1 按CTRL SHIFT P 2 输入搜索Suggest Snippets Prevent Quick Suggestions 控制在活动代码片段内是否禁用快速建议 3 取消选中 4 按CTRL SHIFT P输入搜索 Fi
  • 利用cygwin编译cholmod以获得在windows上可用的库lib

    原文http blog parlin me complie cholmod to get library for win64 记录要点 cygwin好好装 希望哪位神人能够提供一个好用的cygwin国内mirror 编译cholmod的时候
  • 同源策略与跨域

    前言 最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到 大致看了下腾讯云关于设置跨域访问的教程 按照前端同学给的域名等选项就给配了 而且测试下来也是好的 但是呢一直不知道什么是跨域这里就做一个简单的学习记录 一
  • 批量给多台Android手机安装APK脚本

    问题场景 测试让开发给4台手机安装测试版的APK 现实跑4次程序 于是该程序说 要是有个一次性安装多台手机APK的方法就好了 于是该脚本就出现了 并且还可以安装多个apk 以上是2个apk同时给2台设备安装 一键即可 把需要安装的apk放到
  • 百度AI接口测试案列一:车牌识别

    1 打开百度AI网站 百度AI网站 2 登录百度账号 进入控制台 选择文字识别服务 如图 3 点击立即使用 然后创建应用 之后输入应用名称 描述 随便写 并选择应用类型 之后点击 立即创建 按钮 创建完毕 点击 返回应用列表 如下图 注 A
  • linux删除文件_Linux中如何删除常用方式无法删除的文件

    前言 我们都知道 在linux删除一个文件可以使用rm命令 但是有一些特殊名称的文件使用普通的rm方式却没法删除 本文介绍linux中删除特殊名称文件的多种方式 linux文件命名规则 在介绍之前 简单说明一下linux中文件命名规则 文件
  • RegExp正则表达式-基本语法

    RegExp 百度云资料 密码 f89c 里面有详细的语法跟例子 希望对大家有帮助 课前补充 转义字符 多行字符串 字符串换行符 n RegExp作用 匹配特殊字符或有特殊搭配原则的字符的最佳选择 创建方式 直接量 推荐 new RegEx
  • Python 装饰器深入解析

    1 什么是装饰器 装饰器是给现有的模块增添新的小功能 可以对原函数进行功能扩展 而且还不需要修改原函数的内容 也不需要修改原函数的调用 1 1 装饰器的使用符合了面向对象编程的开放封闭原则 开放封闭原则主要体现在两个方面 对扩展开放 意味着
  • [LeetCode]4 两个有序数组的中位数

    Median of Two Sorted Arrays 两个有序数组的中位数 难度 hard There are two sorted arrays nums1 and nums2 of size m and n respectively
  • webstorm vue 项目卡顿现象 解决

    Settings editor File Types ignore files and folders 要忽略的文件添加 node modules 然后点击应用 在项目中点击node modules 右键 Mark Directory as
  • CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY

    在上一章里面 我们用cmake做了一个最简单的项目 这一节我们尝试一写比较常见的cmake配置 这次我们构建如下的目录结构 其中int plus h的代码如下 int int plus const int a const int b int