2. CMake 系列 – 编译多文件项目

2. CMake 系列 – 编译多文件项目

1. 编译不使用第三方库的项目

1.1 项目目录结构

test/
├── build
├── CMakeLists.txt
└── src
    ├── include
    │   └── sub │   └── sub.h ├── init │   └── main.c └── sub └── sub.c

博主一般写项目都是以这种风格进行划分目录,这个风格也是参考内核风格。

build: 存放 cmake 生成的相关文件和make 编译生成的相关中间文件

CMakeLists.txt: 使用cmake 语法编写这个文件,cmake 负责将其转换为相对应makefile

src: 存放源代码

include: 存放每个模块头文件,每个模块都有自己的目录;

1.2 相关代码

sub.h

#ifndef _SUB_H #define _SUB_H int sub(const int a, const int b); #endif

sub.c

#include "sub/sub.h" int sub(const int a, const int b) { return a - b; }

main.c

#include "sub/sub.h" #include <stdio.h> int main(int argc, char **argv) { int num = sub(10, 8); printf("10 - 8 = %d\n", num); return 0; }

CMakeLists.txt

cmake_minimum_required(VERSION 2.6) project(project-1) message("Project Name: " ${PROJECT_NAME}) #设置编译参数 set(CMAKE_C_FLAGS "-g -Wall") #设置执行文件输出目录 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 添加头文件路径 include_directories(${PROJECT_SOURCE_DIR}/src/include) # 递归获取目录下所有的C文件 file(GLOB_RECURSE c_files ${PROJECT_SOURCE_DIR}/src/*.c) # 生成执行文件 add_executable(${PROJECT_NAME} ${c_files}) 

1.3 编译

进入test目录

$ cd test $ cd build $ cmake .. $ make $ cd .. $ tree bin

编译后生成执行文件

bin
└── project-1 

运行秩序文件

$ cd bin $ ./ project-1 10 - 8 = 2

2. 编译使用第三方库的项目

2.1 项目目录结构

test1
├── build
├── CMakeLists.txt
└── src
    ├── include
    │   └── sub
    │       └── sub.h
    ├── init
    │   └── main.c
    ├── lib
    │   └── add │   ├── include │   │   └── add.h │   └── lib │   └── libadd.a └── sub └── sub.c

build: 存放 cmake 生成的相关文件和make 编译生成的相关中间文件

CMakeLists.txt: 使用cmake 语法编写这个文件,cmake 负责将其转换为相对应makefile

src: 存放源代码

include: 存放每个模块头文件,每个模块都有自己的目录;

lib: 存放第三库的头文件和lib文件,若是使用多个第三方库,则需分为不同的目录存放。

2.2 相关代码

sub.h

#ifndef _SUB_H #define _SUB_H int sub(const int a, const int b); #endif

sub.c

#include "sub/sub.h" int sub(const int a, const int b) { return a - b; }

add.h

#ifndef _ADD_H #define _ADD_H int add(const int a, const int b); #endif

main.c

#include "sub/sub.h" #include "add.h" #include <stdio.h> int main(int argc, char **argv) { int a = 10; int b = 8; printf("%d - %d = %d\n", a, b, sub(a, b)); printf("%d + %d = %d\n", a, b, add(a, b)); return 0; } 

CMakeLists.txt

cmake_minimum_required(VERSION 2.6) project(project-2) message("Project Name: " ${PROJECT_NAME}) #设置编译参数 set(CMAKE_C_FLAGS "-g -Wall") #设置执行文件输出目录 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 添加头文件路径 include_directories(${PROJECT_SOURCE_DIR}/src/include) # 添加第三方库(add)头文件路径 include_directories(${PROJECT_SOURCE_DIR}/src/lib/add/include) #添加库文件搜索路径 link_directories(${PROJECT_SOURCE_DIR}/src/lib/add/lib) # 递归获取目录下所有的C文件 file(GLOB_RECURSE c_files ${PROJECT_SOURCE_DIR}/src/*.c) # 生成执行文件 add_executable(${PROJECT_NAME} ${c_files}) # 执行文件链接外部库文件 target_link_libraries(${PROJECT_NAME} add) 

2.3 编译

进入test1目录

$ cd test1 $ cd build $ cmake .. $ make $ cd .. $ tree bin

编译后生成执行文件

bin
└── project-2 

运行执行文件

$ cd bin $ ./ project-2 10 - 8 = 2 10 + 8 = 18 
出处:https://www.cnblogs.com/standardzero/p/10781223.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119545.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2021navicat激活码(最新序列号破解)

    2021navicat激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    118
  • Spark Streaming Join

    Spark Streaming Join多数据源Join思路多数据源Join大致有以下三种思路:数据源端Join,如Android/IOS客户端在上报用户行为数据时就获取并带上用户基础信息。计算引擎上Join,如用SparkStreaming、Flink做Join。结果端Join,如用HBase/ES做Join,Join键做Rowkey/_id,各字段分别写入列簇、列或field。三种思路各有优劣,使用时注意…

    2022年6月30日
    23
  • 中国地图china.js[通俗易懂]

    中国地图china.js[通俗易懂]中国地图china.js一、简介中国地图china是基于echarts.js和china.js绘制图像。官方已不支持china.js下载china.js:https://static.delebug.com/echarts/china.js二、配置项//china.js的配置项与echarts基本图形配置项相通//关于echarts基本图形配置参考:https://echarts.apache.org/v4/zh/option.html//其中china地图主要配置不同处在seri

    2022年7月20日
    17
  • Pycharm轻松创建Flask项目

    Pycharm轻松创建Flask项目打开Pycharm的file,选择创建新的项目,然后弹出对话框,我们可以看到里面有很多的案例,Flask、Django等等,我们选择生成Flask的demo程序。选择创建之后一个简易的Flask项目就出现在我们眼前,第一个是入口程序,还有一个static的静态目录,templates是模板存放的位置。在Pycharm上面有个run,我们可以选择run来启动Flask的服务,默认打开…

    2022年8月25日
    3
  • 华为面试笔试题库_c++笔试题

    华为面试笔试题库_c++笔试题整理了一下华为往届笔试面试题,希望对大家有帮助:超级有用的面试题:Java常见面试题   常见算法面试题  数据库常见面试题 操作系统常见面试题  C/C++常见面试题 大数据常见面试  python常见面试来源:华为笔试面试圈&gt;&gt;1、2018华为校招机试题目2、2018华为届校园招聘软件开发岗笔试题3、2017华为笔试题及答案4、2017年华为笔试…

    2022年8月27日
    4
  • CMD命令:不是内部或者外部命令也不是可运行的程序或批处理文件

    CMD命令:不是内部或者外部命令也不是可运行的程序或批处理文件前言:相信有很多小伙伴都比较喜欢使用Command命令来快速的打开或运行程序,但是有些时候命令提示符会和我们开个小玩笑。今天我就教大家如何管教这个不听话的cmd!场景:看有些大神在命令提示符里输入两句命令就能执行一大串东西,本着学习的态度,先试试再说!没成想出现了:“不是内部或外部命令,也不是可运行的程序或批处理文件。”通过各种查各种找,终于…

    2022年5月8日
    384

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号