CMake 基础使用

一、环境搭建

1.1 操作系统

使用Ubuntu系统进行相关学习,具体信息如下

cat /etc/lsb-release

1.2 安装cmake

使用指令【sudo apt install cmake】安装cmake,安装成功后使用【cmake -version】查看安装版本。

sudo apt install cmake 
cmake -version

1.3 安装tree

使用指令【sudo apt-get -y install tree】安装tree,用于以树状图形式列出目录的内容。

二、案例

2.1 单文件

2.1.1 创建目录

mkdir demo1

2.1.2 创建文件

使用指令【cd demo1】进入【demo1】文件夹,使用【touch】指令创建相关文件,指令如下:

cd demo1 
touch main.c CMakeLists.txt

2.1.3 文件目录

使用tree查看文件目录

2.1.4 文件内容

使用vi指令向文件中写入内容,内容如下:

main.c

#include <stdio.h> 
int main(void) 
{ 
    printf("Hello World\n"); 
    return 0; 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 指定生成目标 
add_executable(main main.c)

2.1.5 编译

使用【cmake.】生成makefile,指令如下:

cmake .

执行结果如下:

编译后新增的文件如下:

使用make编译源码,指令如下:

make

执行结果如下:

2.1.6 程序运行

./main

运行结果如下:

2.2 多文件

2.2.1 创建目录

mkdir demo2

2.2.2 创建文件

使用指令【cd demo2】进入【demo2】文件夹,使用【touch】指令创建相关文件。

cd demo2 
touch main.c test1.c test1.h CMakeLists.txt

2.2.3 文件目录

使用tree查看文件目录

2.2.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 
int main(void) 
{ 
    fun_test(300); 
    return 0; 
}

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test(int data); 

#endif

test1.c

#include <stdio.h> 
#include "test1.h" 

void fun_test(int data) 
{ 
    printf("data is %d\n", data); 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 指定生成目标 
add_executable(main main.c test1.c)

2.2.5 编译

使用【cmake.】生成makefile

cmake .

执行结果如下:

编译后新增的文件如下:

使用make编译源码

make

执行结果如下:

2.2.6 程序运行

./main

运行结果

2.3 多文件-同一目录

2.3.1 创建目录

mkdir demo3

2.3.2 创建文件

使用指令【cd demo3】进入【demo3】文件夹,使用【touch】指令创建相关文件。

cd demo3 
touch main.c test1.c test1.h test2.c test2.h CMakeLists.txt

2.3.3 文件目录

使用tree查看文件目录

2.3.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 
#include "test2.h" 

int main(void) 
{ 
    fun_test1(100); 
    fun_test2(200); 
    return 0; 
}

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test1(int data); 

#endif

test1.c

#include <stdio.h> 
#include "test1.h" 

void fun_test1(int data) 
{ 
    printf("test1 data is %d\n", data); 
}

test2.h

#ifndef _TEST_2_H_ 
#define _TEST_2_H_ 

void fun_test2(int data); 

#endif

test2.c

#include <stdio.h> 
#include "test2.h" 

void fun_test2(int data) 
{ 
    printf("test2 data is %d\n", data); 
}

CMakeLists.txt -- 当前目录下所有文件

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 查找当前目录下的所有源文件,并将名称保存到 SRC_LIST 变量 
aux_source_directory(. SRC_LIST) 
# 指定生成目标 , ${SRC_LIST} 获取变量 SRC_LIST值 
add_executable(main ${SRC_LIST})

CMakeLists.txt -- 指定具体文件

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 指定具体源文件名称给 变量 SRC_LIS 
set( SRC_LIST 
    ./main.c 
    ./test1.c 
    ./test2.c) 
# 指定生成目标 , ${SRC_LIST} 获取变量 SRC_LIST值 
add_executable(main ${SRC_LIST})

2.3.5 编译

使用【cmake.】生成makefile

cmake .

执行结果如下:

编译后新增的文件如下:

使用make编译源码

make

执行结果如下:

2.3.6 程序运行

./main

运行结果

2.4 多文件-不同目录

2.4.1 创建目录

mkdir demo4

2.4.2 创建文件

使用指令【cd demo4】进入【demo4】文件夹,使用【mkdir】【touch】指令创建相关文件夹与文件。

cd demo4 
mkdir test1 test2 
touch ./test1/test1.c ./test1/test1.h 
touch ./test2/test2.c ./test2/test2.h 
touch main.c CMakeLists.txt

2.4.3 文件目录

使用tree查看文件目录

2.4.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 
#include "test2.h" 

int main(void) 
{ 
    fun_test1(100); 
    fun_test2(200); 
    return 0; 
}

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test1(int data); 

#endif

test1.c

#include <stdio.h> 
#include "test1.h" 

void fun_test1(int data) 
{ 
    printf("test1 data is %d\n", data); 
}

test2.h

#ifndef _TEST_2_H_ 
#define _TEST_2_H_ 

void fun_test2(int data); 

#endif

test2.c

#include <stdio.h> 
#include "test2.h" 

void fun_test2(int data) 
{ 
    printf("test2 data is %d\n", data); 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 将[test1 test2] 目录添加到编译器的头文件搜索路径之下 
include_directories (test1 test2) 
# 查找[test1]目录下的所有源文件
# 并将名称保存到 SRC_LIST1 变量 
aux_source_directory (test1 SRC_LIST1) 
# 查找[test2]目录下的所有源文件
# 并将名称保存到 SRC_LIST2 变量 
aux_source_directory (test2 SRC_LIST2) 
# 指定生成目标
# ${SRC_LIST1} 获取变量 SRC_LIST1值 
# ${SRC_LIST2} 获取变量 SRC_LIST2值 
add_executable (main main.c ${SRC_LIST1} ${SRC_LIST2})

2.4.5 编译

使用【cmake.】生成makefile

cmake .

执行结果如下:

编译后新增的文件如下:

使用make编译源码

make

执行结果如下:

2.4.6 程序运行

./main

运行结果

2.5 项目级目录

2.5.1 创建目录

mkdir demo5

2.5.2 创建文件

使用指令【cd demo5】进入【demo5】文件夹,使用【mkdir】【touch】指令创建相关文件夹与文件。

  • bin 可执行文件输出目录
  • build 编译生成对象文件存储目录
  • include 头文件存储目录
  • src 源码存储目录
cd demo5 
mkdir bin build include src 
touch ./include/test1.h ./include/test2.h 
touch ./src/test1.c ./src/test2.c ./src/main.c 
touch CMakeLists.txt

2.5.3 文件目录

使用tree查看文件目录

2.5.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 
#include "test2.h" 

int main(void) 
{
    fun_test1(100); 
    fun_test2(200); 
    return 0;
}

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test1(int data); 

#endif

test1.c

#include <stdio.h> 
#include "test1.h" 

void fun_test1(int data) 
{ 
    printf("test1 data is %d\n", data); 
}

test2.h

#ifndef _TEST_2_H_ 
#define _TEST_2_H_ 

void fun_test2(int data); 

#endif

test2.c

#include <stdio.h> 
#include "test2.h" 

void fun_test2(int data) 
{ 
    printf("test2 data is %d\n", data); 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 设置可执行文件的输出路径 
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 
# 查找[src]目录下的所有源文件
# 并将名称保存到 SRC_LIST 变量 
aux_source_directory (src SRC_LIST) 
# 将[include] 目录添加到编译器的头文件搜索路径之下 
include_directories (include) 
# 指定生成目标 
# ${SRC_LIST} 获取变量 SRC_LIST值 
add_executable (main ${SRC_LIST})

2.5.5 编译

进入【build】目录下,使用【cmake..】生成makefile

cd build 
cmake ..

执行结果如下:

编译后新增的文件如下:

进入【build】目录下,使用make编译源码

make

执行结果如下:

2.5.6 程序运行

进入【bin】目录下,执行程序

./main

运行结果

2.6 项目级目录-多级CMakeLists

2.6.1 创建目录

mkdir demo6

2.6.2 创建文件

使用指令【cd demo6】进入【demo6】文件夹,使用【mkdir】【touch】指令创建相关文件夹与文件。

  • bin 可执行文件输出目录
  • build 编译生成对象文件存储目录
  • include 头文件存储目录
  • src 源码存储目录
cd demo6 
mkdir bin build include src 
touch ./include/test1.h ./include/test2.h 
touch ./src/test1.c ./src/test2.c ./src/main.c ./src/CMakeLists.txt 
touch CMakeLists.txt

2.6.3 文件目录

使用tree查看文件目录

2.6.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 
#include "test2.h" 

int main(void) 
{ 
    fun_test1(100); 
    fun_test2(200); 
    return 0; 
}

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test1(int data); 

#endif

test1.c

#include <stdio.h> 
#include "test1.h" 

void fun_test1(int data) 
{ 
    printf("test1 data is %d\n", data); 
}

test2.h

#ifndef _TEST_2_H_ 
#define _TEST_2_H_ 

void fun_test2(int data); 

#endif

test2.c

#include <stdio.h> 
#include "test2.h" 

void fun_test2(int data) 
{ 
    printf("test2 data is %d\n", data); 
}

src/CMakeLists.txt

# 查找当前目录下的所有源文件 
# 并将名称保存到 SRC_LIST 变量 
aux_source_directory (. SRC_LIST) 
# 将[include] 目录添加到编译器的头文件搜索路径之下 
include_directories (../include) 
# 指定生成目标 
# ${SRC_LIST} 获取变量 SRC_LIST值 
add_executable (main ${SRC_LIST}) 
# 设置可执行文件的输出路径 
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 添加 src 子目录 
add_subdirectory (src)

2.6.5 编译

进入【build】目录下,使用【cmake..】生成makefile

cd build 
cmake ..

执行结果如下:

编译后新增的文件如下:

进入【build】目录下,使用make编译源码

make

执行结果如下:

2.6.6 程序运行

进入【bin】目录下,执行程序

./main

运行结果

2.7 库文件生成

2.7.1 创建目录

mkdir demo7

2.7.2 创建文件

使用指令【cd demo7】进入【demo7】文件夹,使用【mkdir】【touch】指令创建相关文件夹与文件。

  • lib 库文件存储目录
  • build 编译生成对象文件存储目录
  • include 头文件存储目录
  • src 源码存储目录
cd demo7 
mkdir lib build include src 
touch ./include/test1.h 
touch ./src/test1.c 
touch CMakeLists.txt

2.7.3 文件目录

使用tree查看文件目录

2.7.4 文件内容

test1.h

#ifndef _TEST_1_H_ 
#define _TEST_1_H_ 

void fun_test1(int data); 

#endif

test1.c

#include <stdio.h> 
#include "../include/test1.h" 

void fun_test1(int data) 
{ 
    printf("lib test1 data is %d\n", data); 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 指定具体源文件名称给 变量 SRC_LIS 
set (SRC_LIST ${PROJECT_SOURCE_DIR}/src/test1.c) 
# 生成动态链接库 test1_shared 
add_library (test1_shared SHARED ${SRC_LIST}) 
# 生成静态链接库 test1_static 
add_library (test1_static STATIC ${SRC_LIST}) 
# 更改[test1_shared]文件的输出名称为[test1] 
set_target_properties (test1_shared PROPERTIES OUTPUT_NAME "test1") 
# 更改[test1_static]文件的输出名称为[test1] 
set_target_properties (test1_static PROPERTIES OUTPUT_NAME "test1") 
# 设置编译生成的目标库的产生目录 
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

2.7.5 编译

进入【build】目录下,使用【cmake..】生成makefile

cd build 
cmake ..

执行结果如下:

编译后新增的文件如下:

进入【build】目录下,使用make编译源码

make

执行结果如下:

2.7.6 库文件查看

进入【lib】目录下,使用tree查看文件

tree

运行结果

  • libtest1.a 静态库
  • libtest1.so 动态库

2.8 库文件使用

2.8.1 创建目录

mkdir demo8

2.8.2 创建文件

使用指令【cd demo8】进入【demo8】文件夹,使用【mkdir】【touch】指令创建相关文件夹与文件。将【第八章】生成的库文件、头文件复制到【lib】文件夹中。

  • bin 可执行文件输出目录
  • lib 库文件存储目录
  • build 编译生成对象文件存储目录
  • src 源码存储目录
cd demo8 
mkdir bin lib build src 
touch ./src/main.c 
touch CMakeLists.txt 
cp ../demo7/include/test1.h ./lib/ 
cp ../demo7/lib/libtest1.a ./lib/ 
cp ../demo7/lib/libtest1.so ./lib/

2.8.3 文件目录

使用tree查看文件目录

2.8.4 文件内容

main.c

#include <stdio.h> 
#include "test1.h" 

int main(void) 
{ 
    fun_test1(400); 
    return 0; 
}

CMakeLists.txt

# CMake 最低版本号要求 
cmake_minimum_required (VERSION 3.2) 
# 项目信息 
project (demo) 
# 设置可执行文件的输出路径 
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 
# 指定具体源文件名称给 变量 SRC_LIS 
set (SRC_LIST ${PROJECT_SOURCE_DIR}/src/main.c) 
# 将[lib] 目录添加到编译器的头文件搜索路径之下 
include_directories (${PROJECT_SOURCE_DIR}/lib) 
# 动态文件查找,并将查询的文件名称给 变量 TEST_LIB 
find_library(TEST_LIB libtest1.so HINTS ${PROJECT_SOURCE_DIR}/lib) 
# 静态文件查找,并将查询的文件名称给 变量 TEST_LIB 
# find_library(TEST_LIB libtest1.a HINTS ${PROJECT_SOURCE_DIR}/lib) 
# 指定生成目标 
# ${SRC_LIST} 获取变量 SRC_LIST值 
add_executable (main ${SRC_LIST}) 
# 添加链接库 
target_link_libraries (main ${TEST_LIB})

2.8.5 编译

进入【build】目录下,使用【cmake..】生成makefile

cd build 
cmake ..

执行结果如下:

编译后新增的文件如下:

进入【build】目录下,使用make编译源码

make

执行结果如下:

2.8.6 程序运行

进入【bin】目录下,执行程序

./main

运行结果

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值