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
2. CMake 系列 - 编译多文件项目的更多相关文章
- 3. CMake 系列 - 分模块编译&安装项目
目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 测试模块 2.4 顶层 CMakeLists.txt 3. 编译 & 安装 4. 项目安装基本语法 ...
- 解决vscode可以编译通过c++项目,但头文件有红色波浪线的问题
解决vscode可以编译通过c++项目,但头文件有红色波浪线的问题 一.问题描述 我是在Ubuntu 16.04的环境下,用vscode写代码的,一般不使用vscode自带的编译环境,而是用cmake ...
- VS2012更改项目编译后文件输出目录
1.现在我的解决方案里有存在两个项目,分别是类库项目ClassLibrary1和控制台项目ConsoleApplication1,默认情况下当解决方案重新生成后,这两个项目所对应的编译后文件分别会存在 ...
- idea打包或编译错误,错误为c盘idea路径某些文件被占用(非idea文件,项目生成的文件)
方法列表(2的效果可能更好) 1.将被占用的文件删除之后,重新打包或编译. 2.多编译几次项目. 3.发现真正可能的原因.(貌似被南航企业版360拦截了,导致targe或maven等文件被占用问题) ...
- QT小技巧—更好管理项目(增加预编译头文件,并且指定moc文件的生成位置)good
预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...
- maven编译问题-maven项目运行时找不到文件,解决方案之一
问题描述:以上信息是tomcat在启动项目的时候报的错误信息,发现没有找到配置文件,实际上配置文件在项目中是存在的,但是,在编译过程中,配置文件没有能加载到编译后的项目中.就造成了,找不到这些怕配置文 ...
- AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)
1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...
- [52ABP系列] - 002、模板项目配合代码生成器开发
前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...
- CMake方式编译
[1]CMake基础 CMake是一种跨平台编译工具 CMake主要是编写CMakeLists.txt文件 通过CMake命令将CMakeLists.txt文件转化为make所需的Makefile文件 ...
随机推荐
- 【毕业原版】-《贝德福特大学毕业证书》Bedfordhire一模一样原件
☞贝德福特大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- java基础 —— properties 使用
目的:分别读取myPro*.properties文件内容,复习一下项目中读取资源配置文件的方法. 项目下载地址:http://pan.baidu.com/s/1jHuzPxs 项目结构如图,ReadP ...
- mybatis 增加热加载xml
由于在本地开发环境上每次修改mybatis xml文件都需要手动重启服务,调试的很麻烦,所以需要热加载xml文件来避免浪费时间,于是网上搜一下资料,看了下有一大堆,但试了下真正能跑起来没有(大都代码没 ...
- Redis 实战篇之搭建集群
Redis 集群简介# Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案.完全去中心化,由多个节点组成,所有节点彼此互联.Redis 客户 ...
- 《前端之路》之 Babel 下一代 JavaScript 语法编译器
写本章的内容的出发点主要是 为了对于之前关于 JS 版本的一个总结,在之前的开发中,我们始终对于 ECMAScript 的版本的更新不够重视,以至于在后面的 开发过程中,我们始终会被各种新奇的语法打断 ...
- 带着新人看java虚拟机06(多线程篇)
其实多线程还有很多的东西要说,我们慢慢来,可能会有一些东西没说到,那就没办法了,只能说尽量吧! 1.synchronized关键字 说到多线程肯定离不开这个关键字,为什么呢?因为多线程之间虽然有各自的 ...
- Linux V4L2之camera
一.硬件知识 1. 摄像头硬件结构和工作原理,如图1&图2 外部光线穿过lens镜头,经过红外滤光片后光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字 ...
- 给女朋友讲解什么是Optional【JDK 8特性】
前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本<与孩子一起学编程>的书,于是今天就给女朋友讲解一下什么是Optional类. 至于她能不能看懂,那肯定是看不懂的.(学 ...
- NET微信公众号开发环境搭建(一)-了解微信由来
公众号的应用,开发及调试环境搭建 花生壳要注册 需要二十多块钱 ,还要实名认证,估计要一两天才能审核通过 主要就是在 windows搭建测试环境 1.微信的应用场景 360百科微信简介 ht ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...