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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 会计初级学习笔记

    会计初级学习笔记

    2021年6月30日
    87
  • 布隆过滤器、哈希一致性

    布隆过滤器、哈希一致性

    2021年11月12日
    37
  • 今儿下午疲惫极了_形容疲惫至极的诗句

    今儿下午疲惫极了_形容疲惫至极的诗句回家的公车上人也特别的多,春天来了,气温渐温,街上的颜色也丰富起来,我一路的走,一路的观望,看着一张张的笑脸,我也一路的想,想我爱的人和爱我的人,不觉得走神了。下车没两步,我摔了一交,结结实实的。手中的电脑包抛了老远,我一下子倒在了路边,脑子嗡响了一下,暂时的记忆就没了。大约有那么两三秒,也许是我摔倒的动静太大了,感觉周围的目光都在朝我这边看,一时间的尴尬,没顾得上身上的土,站起来就往住的方向猛走

    2022年9月18日
    3
  • 2020/4/1微信小程序笔记

    2020/4/1微信小程序笔记1.微信小程序的登录流程 通过wx.login()获取登录凭证code 通过button组件的open-type=”getUserInfo”, 获取用户信息 将获取到的登录凭证和用户信息传递到自己的服务器 在自己的服务器上将登录凭证发送到微信的服务器上换取openid和session_key …

    2022年8月18日
    8
  • 你有网站吗_有些网站进不去怎么办

    你有网站吗_有些网站进不去怎么办1.最强大的“免费电子书”下载区——新浪电子书共享http://ishare.iask.sina.com.cn/(数十万册哦,全是免费滴!)2.性能很好的免费网络硬盘——云盘网(10G免费超大空间哦,支持共享,可加密文件)http://www.diskes.com/3.爱酷美剧(一边看美剧,一边学英语,不耽误啊!)http://www.icoolen.com/film4.传说中“天涯第一镇山神贴”!!!(先说明白了。机子配置低的不要点开。会死机的。镇山贴可不是开玩笑的,配置低的,直接卡死在外面,配置

    2022年10月2日
    5
  • iscsiadm命令基本用法[通俗易懂]

    iscsiadm命令基本用法[通俗易懂]发现目标iscsiadm-mdiscovery-tsendtargets-p192.168.1.1:3260-mdiscovery指定模式为discovery-p192.168.1.1:3260指定目标ip和端口登入节点iscsiadm-mnode–Tiqn.1997-05.com.test:raid-p192.168.1.1:3260-l系统启动时自动登入iscsiadm-mnode–Tiqn.1997-05.com.test:raid-p192.16

    2022年8月23日
    8

发表回复

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

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