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

CMake编译指令极简说明

为什么使用CMake

对于一段高级程序编写的代码,计算机是不能直接拿来运行的,我们需要对其进行预处理——>编译——>汇编——>链接四个步骤,它才能成为计算机可识别的可执行文件。

对于单个程序,我们直接使用gcc/g++编译就可以,一般来说gcc test.c -o test就可以生成可执行文件test

当然,我们可以添加一些选项,比如链接静态库、动态库啥的

gcc test.c -o test -L./myPath -lstaticLib
gcc test.c -o test -L./myPath -ldynamicLib
# -L :添加库文件搜索路径。例如,-L./myPath会让链接器在/my/path下查找库文件
# -l :链接库文件,链接器会在指定的路径下查找库文件。
# 编译器会根据目录中是否有对应的.a或.so文件进行选择,两者都存在时优选.so动态库

对于少数文件我们可以直接在终端输入上述命令进行编译,但是,一旦我们的文件比较多,又有很多的编译选项,这时在命令行逐个输入就很麻烦了,此时我们可以将这些命令按一定的语法写在一个文件里,这个文件就叫Makefile,此时我们只需要执行Makefile这一个文件就可以编译整个项目了。

但是,Makefile的语法相对来说比较复杂,越大的项目,使用Makefile来管理就越复杂

CMake的作用是自行生成Makefile,相比直接写MakefileCMake配置文件的编写更简洁和易于理解,更容易扩展,此外还能够跨平台支持(Makefile是特定于某个平台的),因此,CMake目前使用比较广泛。

下面分享CMake配置文件CMakeLists.txt中一些最常见的命令。


常见指令分类与汇总

类别命令含义参数说明
基础cmake_minimum_required (VERSION 2.8)CMake的最低版本要求
基础 project (learn_cmake)项目的工程名
辅助aux_source_directory(dir SRC_LIST)dir下的源文件添加到变量SRC_LIST源文件的目录 源文件集合变量
辅助set(SRC_LIST main.c testFunc.c)设置变量的值变量名称 变量的值
辅助${SRC_LIST}变量引用语法,取SRC_LIST变量代表的值
辅助message(STATUS "The SRC_LIST is: ${SRC_LIST}")输出信息到终端消息类型 要输出的字符串
辅助option(MYDEBUG "enable debug compilation" OFF)定义变量用于条件编译变量名 描述 变量值
辅助set(CACHE MY_GLOBAL_STRING "simple")使变量MY_GLOBAL_STRING在整个CMake项目可见将变量设置为CACHE缓存变量
可执行文件add_executable(main ${SRC_LIST}})生成可执行文件main可执行文件 源文件列表
头文件搜索include_directories(dir1 dir2)引入头文件的搜索路径头文件搜索路径
多级目录add_subdirectory(src)编译时添加子目录src中的CMakeLists.txt
库文件add_library(libNameShared SHARED ${SRC_LIST})生成库库名称 静态/动态 源文件
库文件find_library(MY_LIB_PATH myLib searchPath)查找myLib库文件变量名 查找的库 查找路径
库文件target_link_libraries(execute_file ${MY_LIB_PATH})指定可执行文件链接哪些库可执行文件 待链接的库
其它set_target_properties(libNameShared PROPERTIES OUTPUT_NAME "libName")设置最终生成的库的一些属性库名称 属性的开始 目标文件名称(键) 库新名称(值)
其它add_compile_options(-std=c++11)添加全局编译选项
补充
库函数find_package(OpenCV REQUIRED)查找OpenCV库,并能自动处理库的依赖项find_package适用于大多数第三方库和复杂的库配置;find_library适用于自定义库或简单的库配置

http://www.mrgr.cn/news/14726.html

相关文章:

  • python之多线程和多进程以及threading和multiprocessing模块
  • 宠物空气净化器应该怎么选择?希喂、IAM、有哈哪款性价比高
  • linux neo4j 切换知识图谱
  • css之ShadowDOM
  • 第3章-04-Python库BeautifulSoup安装与讲解
  • HarmonyOS NEXT 实战开发:实现日常提醒应用
  • C#为复杂属性提供下拉式编辑框和弹出式编辑框
  • linux系统编程-网络-tcp(29)
  • 笔记本电脑中怎么查看光驱
  • Linux驱动学习之内核poll阻塞
  • 【C++ Primer Plus习题】6.5
  • 【项目日记】高并发内存池项目---整体框架设计
  • 鸿蒙ArkTS语言学习(五):扩展(函数)@Extend@Styles@Builder
  • 你的软件系统安全吗
  • class 2: vue.js 3 模板语法和内置指令
  • 在C语言中使用POSIX线程库(pthread)实现多线程编程
  • Amazon Bedrock 实践:零基础创建贪吃蛇游戏
  • 计算机毕业设计选题推荐-Cosplay论坛系统-Java/Python项目实战
  • gNB UE发送Timing AdvanceCommand
  • 闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)