首页 > 其他分享 >CMake

CMake

时间:2024-05-25 17:44:05浏览次数:7  
标签:可执行文件 CMakeLists CMake 变量 源文件 txt 目录

一、CMake概述

CMake是一个跨平台的项目构建工具。编写完CMakeLists.txt(注意文件名称是固定的)后,执行cmake命令,生成Makefile文件。当然你也可以手动去编写Makefile文件,但是编写的工具量比较大,而且依赖关系也比较多,比较容易出错。

从项目源码到可执行文件的流程图:

项目的一般目录结构:

单独新建一个空目录 build 用来保存cmake命令后的中间文件,不会把原来的目录结构搞混乱,而且看起来更整洁。

二、CMakeLists.txt

  • CMakeLists.txt语法

一些内置预定义变量以及含义:

预定义变量 含义
PROJECT_SOURCE_DIR 工程的根目录
PROJECT_NAME 返回通过project命令定义的项目名
PROJECT_BINARY_DIR 运行cmake命令的目录,通常是在项目下创建build目录,并执行命令
CMAKE_CURRENT_SOURCE_DIR 当前处理CMakeLists.txt所在目录
CMAKE_CURRENT_BINARY_DIR target编译目录(即目标文件输出目录)
CMAKE_CURRENT_LIST_DIR CMakeLists.txt的目录
CMAKE_CURRENT_LIST_LINE 当前所在行(即该变量执行时的所在行)
EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置,需要用户去set
LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置,需要用户去set

通过一个具体的例子,验证表格中的内置变量是否正确:

分析上述结果,变量 EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH 为空,内置无效。

  • CMakeLists.txt模板:
# 指定cmake版本
cmake_minimun_required(VERSION x.x)

# 指定项目名称
project(项目名称xxxx)

# 添加预处理定义,该功能已被其他命令替换(可选)
add_definitions(编译选项)

# 为源文件的添加编译选项(可选)
add_compile_options(选项1 选项2 选项...)

# 指定头文件目录,若存在多个用空格隔开
include_directories(目录1 目录2 目录...)

# 搜索指定目录下所有源文件,可以将所有源文件赋值给一个变量
# 如果不想在add_executable内一个一个写源文件的话,aux_source_directory就很有用
aux_source_directory(目录 变量)

# 设置变量,变量名一般全大写
set(变量 文件名or路径or其他)

# 指定源文件生成库文件(默认生成静态库)。可将static替换为shared,则生成动态库
add_library(库文件名 static 源文件1 源文件2 源文件...)

# 指定库文件目录
link_directories(目录)

# 指定的源文件来生成目标可执行文件
add_executable(目标可执行文件名 源文件)

# 设置链接库,即为目标可执行文件添加需要的库文件
target_link_libraries(目标可执行文件名 库文件名1 库文件名2 库文件名...)

# 输出测试,打印测试字符串,一般用于console log(可选)
message(字符串1 字符串2或变量 字符串...)

# 指定安装目录,一般需要先指定按照目标前缀,例如:/usr,执行make install后,可执行文件安装到:/usr/bin目录下
set(CMAKE_INSTALL_PREFIX /usr)
install(TARGETS ${PROJECT_NAME} DESTINATION bin)

# 查找目标依赖包
find_package()

二、参考地址

Cmake知识----编写CMakeLists.txt文件编译C/C++程序

CMakeLists.txt编写常用命令 - 星星,风,阳光 - 博客园 (cnblogs.com)

CMake 保姆级教程(上)- 爱编程的大丙

标签:可执行文件,CMakeLists,CMake,变量,源文件,txt,目录
From: https://www.cnblogs.com/caojun97/p/18122460

相关文章

  • clion的cMakeList.txt的配置
    保留第一第二行,从第三行开始,使用下面内容替换: #使用此CMakeList时,若要新建C++文件,请按照以下步骤:#1.右键根目录——新建——C/C++源文件#2.在弹出的对话框中,输入文件名(英文小写及下划线),后缀为".cpp",不要勾选“添加到目标”,点击确定。#3.点击左上角横线——文件......
  • cmakelist 编译源码生成动态静态库并链接到项目
    当我们使用vscode编译c++代码时,需要加入第三方代码,而它没有库时。这时候我们就需要自己写一个Cmakelist编译成库,然后链接到自己的项目上。下面我以qt的qtpropertybrowser类为例,这个类并不在qt的标准库中,若是在qtcreator中使用,需要在pro引入该文件路径(qt安装目录里-\Qt\5......
  • vscode使用colcon build编译ros2工程时报错:The current CMakeCache.txt directory...i
    之前已经编译好了一个文件夹A下的工程然后复制出一个文件夹B,再次编译时出现了问题,报错ThecurrentCMakeCache.txtdirectory...isdifferentfrom...其实也能猜到就是当路径从A变到B,不匹配导致报错,但是不知道应该在哪里改CSDN上有个文章给出回答:删除build文件夹,当然把log和ins......
  • CLON + QT + CMAKE debug 不打印 (控制台不输出)
    原因:CMAKE设置了WIN32_EXECUTABLETRUE这表示了要生成一个GUI程序,而且WindowsGUI会禁用控制台输出将set_target_properties(aaPROPERTIESWIN32_EXECUTABLETRUE)修改为set_target_properties(aaPROPERTIESWIN32_EXECUTABLEFALSE)或者手动创建控制台:`//未......
  • PROJECT_SOURCE_DIR 和 CMAKE_SOURCE_DIR
    PROJECT_SOURCE_DIR和CMAKE_SOURCE_DIR对比在CMake中,PROJECT_SOURCE_DIR和CMAKE_SOURCE_DIR是两个非常重要的变量,它们都指向项目的源代码目录,但在多项目(子项目或多个CMakeLists.txt文件)的情况下,它们的值有所不同。CMAKE_SOURCE_DIR定义:CMAKE_SOURCE_DIR 指向最顶层的C......
  • CMake 如何设置 Debug 和 Release 下的不同配置
    CMake设置Debug和Release的不同配置 文章目录CMake设置Debug和Release的不同配置I-原因II-如何设置2.1-配置不同的库2.2-配置不同的宏 I-原因由于Debug和Release下工程的依赖库不同,另外,方便定义不同的宏来隔离调试和发布的代码,如......
  • cmake以源码的方式引入第三方项目
    最前#本文将介绍一种以源码的方式引入第三方库的方法准备#主项目,需要引用第三方库的某些函数第三方库,以源码的形式提供给主项目使用注意:本文的背景:已经将第三方源码下载好。一个例子#我这里准备一个简单的项目,调用第三方库 fmt;其中fmt是以源码的形式引入项目cmake......
  • 在CMakeLists.txt中添加源文件的几种方法
    单个.cpp源文件的情况用这段代码进行测试,CMake中添加一个可执行文件作为构建目标:#include<cstdio>intmain(){printf("Hello,world!\n");}指定源文件的时候可以有两种方式。在创建目标的时候直接指定源文件add_executable(mainmain.cpp)先创建目标,再添加源......
  • cmake配置项目引用动态库
    note#本文将介绍使用FIND_PACKAGE配置项目动态库的方法cmakeversion:3.18platform:win1020H2概述#创建了一个动态库,再由主项目调用该动态库。find<lib库名>.cmake的内容是:1.定义动态库的头文件所在路径2.定义库所在路径写好cmake文件后,也可以方便给其他人调用,省......
  • stm32cubemx+cmake vscode开发
    stm32cubemx在2.17之后可以新建cmake工程文件,然后就可以在vscode中无痛编译单片机程序,可以再配合openocd等编译调试下载1.准备1.1stm32cubemx1.2vscode1.3arm-none-eabi-gcc2.cubemx生成cmake工程文件2.1利用__weak函数实现cubemx代码与用户代码分离2.2利用宏定义......