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 系列 - 编译多文件项目的更多相关文章

  1. 3. CMake 系列 - 分模块编译&安装项目

    目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 测试模块 2.4 顶层 CMakeLists.txt 3. 编译 & 安装 4. 项目安装基本语法 ...

  2. 解决vscode可以编译通过c++项目,但头文件有红色波浪线的问题

    解决vscode可以编译通过c++项目,但头文件有红色波浪线的问题 一.问题描述 我是在Ubuntu 16.04的环境下,用vscode写代码的,一般不使用vscode自带的编译环境,而是用cmake ...

  3. VS2012更改项目编译后文件输出目录

    1.现在我的解决方案里有存在两个项目,分别是类库项目ClassLibrary1和控制台项目ConsoleApplication1,默认情况下当解决方案重新生成后,这两个项目所对应的编译后文件分别会存在 ...

  4. idea打包或编译错误,错误为c盘idea路径某些文件被占用(非idea文件,项目生成的文件)

    方法列表(2的效果可能更好) 1.将被占用的文件删除之后,重新打包或编译. 2.多编译几次项目. 3.发现真正可能的原因.(貌似被南航企业版360拦截了,导致targe或maven等文件被占用问题) ...

  5. QT小技巧—更好管理项目(增加预编译头文件,并且指定moc文件的生成位置)good

    预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...

  6. maven编译问题-maven项目运行时找不到文件,解决方案之一

    问题描述:以上信息是tomcat在启动项目的时候报的错误信息,发现没有找到配置文件,实际上配置文件在项目中是存在的,但是,在编译过程中,配置文件没有能加载到编译后的项目中.就造成了,找不到这些怕配置文 ...

  7. AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

    1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

  8. [52ABP系列] - 002、模板项目配合代码生成器开发

    前言 本篇的主要内容是 52ABP SPA模板如何配合52ABP代码生成器开发项目 如果不了解 52ABP 项目请先看我的第一篇文章 [52ABP系列] - 001.SPA免费项目模版搭建教程 话不多 ...

  9. CMake方式编译

    [1]CMake基础 CMake是一种跨平台编译工具 CMake主要是编写CMakeLists.txt文件 通过CMake命令将CMakeLists.txt文件转化为make所需的Makefile文件 ...

随机推荐

  1. django(权限、认证)系统—— Permissions和Group

    接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证.接下来,我们要看另外一个议题,那就是Authorization授 ...

  2. 深入讨论channel timeout

    深入讨论channel timeout Go 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下: select { case ...

  3. Rmq Problem/mex BZOJ3339 BZOJ3585

    分析: 一开始没看懂题... 后来想用二分答案却不会验证... 之后,想到用主席树来维护... 建一个权值线段树,维护出这个权值以前所有的点最晚在哪里出现... 之后,查一下是不是比查询区间的l断点大 ...

  4. hibernate深度学习 游离状态 HQL

    当我学完这个之后 我仿佛都懂了 = =或许这就是 hibernate的力量吧. 操纵持久化对象(Session) 1.1. 在hibernate中java对象的状态 Hibernate 把对象分为 4 ...

  5. 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)

    作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第二篇,主要讲述发送端程序的原理和过程. 第一 ...

  6. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  7. java常用的框架介绍

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  8. Spring里的Async注解实现异步操作

    异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现. 用法 程序启动时开启@EnableAsync注解 建立新的类型,建 ...

  9. 吴恩达深度学习笔记1-神经网络的编程基础(Basics of Neural Network programming)

    一:二分类(Binary Classification) 逻辑回归是一个用于二分类(binary classification)的算法.在二分类问题中,我们的目标就是习得一个分类器,它以对象的特征向量 ...

  10. Docker入门学习

    Python爬虫 最近断断续续的写了几篇Python的学习心得,由于有开发经验的同学来说上手还是比较容易,而且Python提供了强大的第三方库,做一个小的示例程序还是比较简单,这不我之前就是针对Pyt ...