cmake学习笔记
一、入门案列1
🐹 vim main.c
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
🐹 vim CMakeLists.txt
# 表示需要cmake的最低版本
make_minimum_required (VERSION 2.8)
# 工程名
project (p_hello)
# 二进制elf文件名和所需的源码文件
add_executable(hello main.c)
# 执行cmake
cmake .
# ls 查看目录会多出很多文件,执行make
make
# 执行elf文件
./hello
Hello World!
二、案列2
🐹 vim fun.h
#include <stdio.h>
void add_put();
🐹 vim fun.c
#include "fun.h"
void add_put(){
printf("steins gate!\n");
}
🐹 vim main.c
#include "fun.h"
int main(){
printf("Hello World!\n");
add_put();
return 0;
}
🐹 更改CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (p_hello)
add_executable(hello main.c fun.c)
🐹 重新执行cmake和make
执行时如果报错,可以使用vim多窗口功能对比代码,查看是否有语法或逻辑错误
# 首先打开main.c
vim main.c
# 在指令模式下输入加载fun.c
:sp fun.c
# 在指令模式下输入加载fun.h
:sp fun.h
效果图如下:
三、修改源文件索引
在CMakeLists.txt中,add_executable执行的文件过多时,最好用aux_source_directory 替代源文件索引
# 参数分别是 目录 变量
aux_source_directory(dir var)
修改案列2的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (p_hello)
# 查找当前目录"." 的源码文件,并将其储存在SRC_DIR变量中
aux_source_directory(. SRC_DIR)
# 变量自动转换为源码文件
add_executable(hello ${SRC_DIR})
四、将子目录里面的源码编译成静态库编译
首先在当前目录创建一个adddir目录,进入adddir目录
🐹 vim add.h
int add_num(int a, int b);
🐹 vim add.c
include <stdio.h>
#include "add.h"
int add_num(int a, int b){
return a + b;
}
🐹 vim CMakeLists.txt
aux_source_directory(. SRC_LIB)
# 生成命为add_fun的链接库
add_library(add_fun ${SRC_LIB})
🐹 回到上一级目录
🐹 vim main.c
#include "fun.h"
#include "adddir/add.h"
int main(){
printf("Hello World!\n");
add_put();
printf("15 + 18 = %d\n", add_num(15, 18));
return 0;
}
🐹 vim CMakeLists.txt
make_minimum_required (VERSION 2.8)
project (p_hello)
aux_source_directory(. SRC_DIR)
# 添加子目录adddir
add_subdirectory(adddir)
add_executable(hello ${SRC_DIR})
# 链接自己的静态库
target_link_libraries(hello add_fun)
🐹 重新 cmake 和 make
五、直接添加子目录进行编译
👼 添加子目录subdir进入其中
👼 vim sub.h
int sub_num(int a, int b);
👼 vim sub.c
#include <stdio.h>
#include "sub.h"
int sub_num(int a, int b){
return a - b;
}
👼 回到上级目录将函数添加到main.c
👼 vim CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (p_hello)
aux_source_directory(. SRC_DIR)
aux_source_directory(./subdir SUB_DIR)
add_subdirectory(adddir)
add_executable(hello ${SRC_DIR} ${SUB_DIR})
target_link_libraries(hello add_fun)
六、clion编译多线程
在MCakelist.txt中添加
find_package(Threads REQUIRED)
target_link_libraries(obj_name Threads::Threads)
gcc编译则在最后加上 -pthread
待续……