一、环境搭建
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
运行结果