当前位置: 首页 > news >正文

浅浅的 Cmake

目录

  • 一、Cmake安装和基本使用
    • 1、下载Cmake
    • 2、尝试第一次编译
    • 3、替换成变量
  • 二、Cmake头文件
    • 1、在原来的项目路径基础上可以增加main.h头文件
    • 2、增加头文件
  • 三、添加多个源文件和多组源文件
  • 四、包含其他库文件
  • 五、生成库文件
  • 七、
  • CMake常用变量
  • 使用CMake交叉编译Arm Linux程序

参考资源:
https://zhuanlan.zhihu.com/p/119426899
https://blog.csdn.net/fengzhongluoleidehua/article/details/79809756
https://blog.csdn.net/dabenxiong666/article/details/53998998
添加头文件 https://blog.csdn.net/weixin_44100850/article/details/103697973

一、Cmake安装和基本使用

1、下载Cmake

环境Ubuntu18

sudo apt install cmake

查看版本号

sudo cmake --version

2、尝试第一次编译

建立一个文件夹,里面有:
测试源文件:main.cpp
Cmake文件:CMakeLists.txt
一个存放编译文件的空文件夹:bulid
main.cpp:

#include <stdio.h>
int main (int argc, char *argv[])
{
  printf("123\n");
  return 0;
}

CmakeLists.txt

3、替换成变量

https://www.cnblogs.com/narjaja/p/9533174.html

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

# 设置工程名称,最后输出的可执行文件名称
project(App) 

# 添加可执行文件添加需要编译的文件 
add_executable(App main.cpp) 

进入到bulid目录下,开始编译

Cmake ..
make

最终得到可执行文件App。

使用变量替换生存的执行文件:

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 :https://www.cnblogs.com/narjaja/p/9533174.html
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project(${PROJECT_NAME}) 

# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME} main.cpp) 

二、Cmake头文件

https://www.cnblogs.com/binbinjx/p/5626916.html

1、在原来的项目路径基础上可以增加main.h头文件

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR 0
#define Tutorial_VERSION_MINOR 0

修改原来的源文件:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "main.h"
 
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"%s Version %d.%d\n",argv[0],Tutorial_VERSION_MAJOR,Tutorial_VERSION_MINOR);
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}

2、增加头文件

修改Cmake:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

CmakeLists.txt

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(/)
 
# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME}  main.cpp)

重新进入bulid文件内,编译执行。

三、添加多个源文件和多组源文件

cmake自动添加所有源文件和头文件 https://blog.csdn.net/sep4075/article/details/120001415

1、新建多个源文件和头文件

在这里插入图片描述
2、新的cmake源码
参考:https://www.cnblogs.com/dilex/p/11102152.html

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(Include)

# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")

# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME} ${SRC_DIR_LIST})

另外的方法:

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0)

# 项目名称
project(CMakeFile)

# 设置md5代码文件的路径
set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h")

# 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h")

# 对md5的源码分组到md5组里
source_group(md5 FILES ${MD5_FILE})

# 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})

四、包含其他库文件

 add_executable(。。。)
 target_link_libraries(。。。)

五、生成库文件

1、新的Cmake文件

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(Include)

# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")

# 将DIR_LIB_SRCS中文件列表以静态库的方式加入工程//将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
add_library(
    ${PROJECT_NAME} # 生成的输出个输出工程文件名称
    STATIC          # STATIC生成静态库文件.a  SHARED生成动态库文件.so
    ${SRC_DIR_LIST} # 所有源文件的集合
) 

# 打印SRC_DIR_LIST中列表信息
message(STATUS "SRC_DIR_LIST = ${SRC_DIR_LIST}")			


# 添加可执行文件添加需要编译的文件 
#add_executable(${PROJECT_NAME}  main.cpp)

七、

CMake常用变量

变量名 变量说明
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
PROJECT_SOURCE_DIR CMake源码地址,即cmake命令后指定的地址
PROJECT_BINARY_DIR 运行cmake命令的目录,通常是PROJECT_SOURCE_DIR下的build目录
CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_LIST_DIR 当前文件夹路径
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可执行文件路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成库的文件夹路径
CMAKE_BUILD_TYPE 指定基于make的产生器的构建类型(Release,Debug)
CMAKE_C_FLAGS *.C文件编译选项,如 -std=c99 -O3 -march=native
CMAKE_CXX_FLAGS *.CPP文件编译选项,如 -std=c++11 -O3 -march=native
CMAKE_CURRENT_BINARY_DIR target编译目录
CMAKE_INCLUDE_PATH 环境变量,非cmake变量
CMAKE_LIBRARY_PATH 环境变量
CMAKE_STATIC_LIBRARY_PREFIX 静态库前缀, Linux下默认为lib
CMAKE_STATIC_LIBRARY_SUFFIX 静态库后缀,Linux下默认为.a
CMAKE_SHARED_LIBRARY_PREFIX 动态库前缀,Linux下默认为lib
CMAKE_SHARED_LIBRARY_SUFFIX 动态库后缀,Linux下默认为.so
BUILD_SHARED_LIBS 如果为ON,则add_library默认创建共享库
CMAKE_INSTALL_PREFIX 配置安装路径,默认为/usr/local
CMAKE_ABSOLUTE_DESTINATION_FILES 安装文件列表时使用ABSOLUTE DESTINATION 路径
CMAKE_AUTOMOC_RELAXED_MODE 在严格和宽松的automoc模式间切换
CMAKE_BACKWARDS_COMPATIBILITY 构建工程所需要的CMake版本
CMAKE_COLOR_MAKEFILE 开启时,使用Makefile产生器会产生彩色输出
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式

使用CMake交叉编译Arm Linux程序

https://blog.csdn.net/whahu1989/article/details/104114515

相关文章:

  • 【JavaScript 进阶教程】函数的定义 调用 及 this指向问题
  • 14天刷爆LeetCode算法学习计划——Day02双指针(1)
  • 存储过程浅入深出
  • 一零二四、pyspark在jupyter中的完美运行
  • Nginx监控模块
  • mybatis的test坑(不等于‘‘ 且 不等于0)
  • 使用IDEA快速部署到Docker云端
  • 全志T507 UART复用方法-飞凌嵌入式知识库
  • 【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
  • 2022年数模国赛冲刺之模型复习2
  • 程序包lombok不存在,纠正网上错误答案
  • css知识点总结
  • 【Rust日报】2022-08-29 RLS 谢幕
  • 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)
  • hadoop生态圈面试精华之Yarn
  • 【剑指offer】让抽象问题具体化
  • 3.7、@ResponseBody 和 @RestController
  •  D - 粉碎叛乱F - 其他起义
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java多态
  • Java应用性能调优
  • leetcode388. Longest Absolute File Path
  • Odoo domain写法及运用
  • SpringBoot几种定时任务的实现方式
  • Swift 中的尾递归和蹦床
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 每天一个设计模式之命令模式
  • 我的面试准备过程--容器(更新中)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Semaphore
  • 仓管云——企业云erp功能有哪些?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​水经微图Web1.5.0版即将上线
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET 4.0中的泛型协变和反变
  • .net core控制台应用程序初识
  • .NET Micro Framework初体验(二)
  • .NET Reactor简单使用教程
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net流程开发平台的一些难点(1)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /run/containerd/containerd.sock connect: connection refused
  • @ConditionalOnProperty注解使用说明
  • @Transient注解
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [android学习笔记]学习jni编程
  • [AX]AX2012 SSRS报表Drill through action
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BZOJ1178][Apio2009]CONVENTION会议中心