浅谈cmake,编写CMakeList.txt

简介: 浅谈cmake,编写CMakeList.txt

一、编写CMakeLists.txt

1、同目录下单文件

①在.c文件的同级目录下创建CMakeLists.txt文件

②编写CMakeLists.txt #后为注释

多行注释#[[

]]

③一个基本的CMakeLists.txt编写例子

# CMake 最低版本号要求  防止新语法规则和避免兼容性问题--一般都要加上
cmake_minimum_required (VERSION 2.8)

# 当前项目名称--注意这个不是可执行文件
project (Test)

# 指定生成目标 将1.c生成1  注意,可在1后面添加若干个.c文件
add_executable(1 1.c)

2、同目录下多文件

CMakeLists.txt编写可如下

# CMake 最低版本号要求  防止新语法规则和避免兼容性问题
cmake_minimum_required (VERSION 2.8)

# 当前项目信息--注意这个不是可执行文件
project (Test)

# 指定生成目标 将*.c生成main  注意,可在main后面添加若干个.c文件
add_executable(main main.c Mystring.c 1.c)

但是遇到和之前自己编写makefile的老问题,文件多了,写的容易错漏

使用Cmake命令aux_source_directory (dir 变量名)

cmake:

aux_source_directory (. CUR_SRC) #定义cmake变量

${CUR_SRC} #引用变量

#使用变量做出如下改进

# CMake 最低版本号要求  防止新语法规则和避免兼容性问题
cmake_minimum_required (VERSION 2.8)

# 当前项目信息--注意这个不是可执行文件
project (Test)

# 查找当前目录 . 下的所有源文件.c文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(main ${DIR_SRCS})

3、不同目录下多文件

添加头文件路径:include_directories(指定头文件路径名-相当当前路径写-I路径)

例子:

include_directories (inc)

include_directories (./inc)

以上所有的路径都是从CMakeLists.txt所在路径为起点的相对路径


使用静态库的方式,将不同源文件目录下的.c源文件生成.a文件

①添加子目录:add_subdirectory(指定子目录)

这个命令是告诉当前路径层的CMakeLists.txt 还有额外的目录层需要处理

②添加指定静态库到指定目标:target_link_libraries(目标 库名)

③将指定若干.c源文件编译打包生成静态库文件:add_library (库名 源文件列表)

#最上层的CMakeLists.txt---只管当前目录层的源文件

#版本号
cmake_minimum_required (VERSION 2.8)

#项目信息
project (Test)

#头文件
include_directories(inc)

#指定src为当前目录的子目录
add_subdirectory (src)

#查找当前目录的下所有源文件,保存在CUR_SRC中
aux_source_directory(. CUR_SRC) 

#生成指定目标文件
add_executable (./bin/main ${CUR_SRC})

#先创建main再把库链接到main(注意顺序)

#将指定的库/src/libmylib.a链接到指定目标可执行程序main
target_link_libraries(./bin/main mylib)
#子层的版本号,项目信息可写可不写
cmake_minimum_required (VERSION 2.8)

project (Test)

#.c-->.a静态库

include_directories(inc)

#设置静态库路径,--把静态库libmylib.a放在lib目录下
set(LIBRARY_OUTPUT_PATH ./../lib)

#将当前目录下所有.c放在LIB_SRC中
aux_source_directory(. LIB_SRC)

#将所有.c文件打包生成静态库文件libmylib.a
add_library(mylib ${LIB_SRC}) 

二、拓展:

Cmake默认变量–不需要你定义 可直接使用 有固定意义

PROJECT_NAME:代表当前的项目名称

关于默认变量:

①在引用时要加 ${默认变量名}

②在设置默认变量时,使用set命令 规则:

set (变量名 变量的值)

例如:

set (LIBRARY_OUTPUT_PATH ./…/lib) #设置cmake当前层生成.a .so库文件的存放位置

相关文章
|
存储 网络协议 API
大端与小端概念、多字节之间与单字节多部分的大小端转换详解
大端与小端概念、多字节之间与单字节多部分的大小端转换详解
951 1
Vxworks 6.6系列下载地址
Vxworks 6.6系列下载地址: <br> ---------------------------------- <br><a target="_blank" href="ftp://ftp.windriver.speedera.net/ftp.windriver/internal/eval/vxworks-6.6/CDR-R133467.1-1-00.zip">ftp://ftp.
7275 0
|
存储 API Android开发
getExternalFilesDir到底是什么
getExternalFilesDir对应的目录是/sdcard/Android/data/包名/files/... 可以看到它主要是用来存放应用私有的一些文件。这个目录有几个特性:
1929 0
|
8月前
|
机器学习/深度学习 资源调度 算法
YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS
YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS
3038 6
|
8月前
|
机器学习/深度学习 资源调度 数据可视化
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
348 6
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
|
Linux C++ iOS开发
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(二)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
1498 2
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
358 3
|
存储 Kubernetes 负载均衡
Kubernetes(K8S) 介绍
Kubernetes(K8S) 介绍
166 1
|
机器学习/深度学习 自然语言处理 TensorFlow
TensorFlow 入门超简单!从零开始构建你的第一个神经网络,开启机器学习精彩之旅!
【8月更文挑战第31天】本文介绍了流行开源机器学习框架 TensorFlow,涵盖其安装与首个神经网络构建步骤。TensorFlow 由 Google 开发,适用于计算机视觉及自然语言处理等领域。掌握它不仅提升就业机会,还加深对机器学习的理解。通过安装 Python 并使用 pip 命令安装 TensorFlow,即可按照示例构建、训练并评估简单的线性回归模型,快速开启机器学习之旅。
391 0
|
编译器 C语言 C++
CMake基础(7)编译标志
CMake基础(7)编译标志
814 0