CMakeList使用总结

2023-05-16

一、cmake功能介绍

cmake是跨平台编译工具,编写简单好维护,是make的高级用法。
1.编写CMakeList.txt文件,通过cmake生成Makefile文件,make生成可执行文件、静态库、共享库。
2.cmake是一个跨平台的编译工具,可以用简单的语句来描述所有平台编译。make工具依赖于平台,GNU make,Qt qmake,MS nmake,BSD pmake,makepp等等,这些不同make工具遵循不同的规范标准,所有执行的Makefile文件格式格式不同。
在线帮助文档:https://cmake.org/documentation
3. cmake比configure优秀
configure也是跨平台编译工具,使用比较繁琐.configure脚本为了让一个程序能够在各种不同类型的机器上运行而设计的。在使用make编译源代码之前,configure会根据自己所依赖的库而在目标机器上进行匹配。约定俗成的,所有的configure脚本都把脚本文件名起为configure,一般来讲都是shell脚本,根据所在的系统环境生成makefile文件。有时候看到一些程序的configure内容超级之多,让人难以看下去。configure脚本运行时扫描当前环境,生成一个名为config.status的子脚本。子脚本将Makefile.in文件转换为适应于当前系统环境的Makefile文件。
GNU build system这个工具能够帮助我们生成configure脚本,又叫做Autotools。Autotools包含的命令有autoconf,automake,libtool。

二、CMakeLists编写介绍

1.指定运行配置cmake最低版本: cmake_minimum_required(VERSION 3.13)
2.设置工程名称: project(Test) 获取${PROJECT_NAME}
3.设置变量: SET(VAR 1) ${变量名}
4.获取系统环境变量:

$ENV{系统变量} $ENV{PATH}

5.指定可执行文件生成路径:

SET(EXECUTABLE_OUTPUT_PATH "xxx/bin")

6.指定输出动态库的目录位置:

SET(LIBRARY_OUTPUT_PATH "xxx/lib")

7.获取源代码、头文件路径:

FILE(GLOB SRC_LIST "${PROJECT_SOURCE_DIR}/src/*.cpp")
FILE(GLOB HEAD_LIST "${PROJECT_SOURCE_DIR}/include/*.h")

8.添加头文件路径:

include_directories("${PROJECT_SOURCE_DIR}/include")

9.添加链接库路径:

link_directories("${PROJECT_SOURCE_DIR}/lib")

10.添加生成可执行文件:

add_executable(${PROJECT_NAME} ${SRC_LIST} ${HEAD_LIST})

11.链接库名:

target_link_libraries(${PROJECT_NAME} ${LIB_NAME})

12.添加生成动态库或静态库: 不写默认静态库

add_library(${LIB_NAME} SHARED ${PROJECT_SOURCE_DIR}/third/test.cpp)
add_library(${LIB_NAME}_static STATIC ${PROJECT_SOURCE_DIR}/third/test.cpp)

13.静态库的输出名称:

set_target_properties(${LIB_NAME}_static PROPERTIES OUTPUT_NAME ${LIB_NAME})

14.设置预处理宏开关 开启:

option(USE_TEST "option for test" ON)

15.配置一个头文件用于传递一些CMake中的配置到源代码中

configure_file("${PROJECT_SOURCE_DIR}/config.in" "${PROJECT_SOURCE_DIR}/config.h")

16.make install 
16.1安装可执行文件、静态库、动态库。

  install(TARGETS myrun mylib mystaticlib
	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
	LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
	ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )

16.2安装整个目录

  install(DIRECTORY ${OUT_PATH} DESTINATION ${PROJECT_SOURCE_DIR})
  install(DIRECTORY ${OUT_PATH} DESTINATION ${PROJECT_SOURCE_DIR}
	 PATTERN "${EXE_NAME}" PERMISSIONS
 	OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)

16.3安装文件

  install(FILES "${PROJECT_BINARY_DIR}/bin/${EXE_NAME}" DESTINATION "${PROJECT_SOURCE_DIR}/bin" PATTERN "${EXE_NAME}" PERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)
  install(FILES "${PROJECT_BINARY_DIR}/lib/lib${LIB_NAME}.a" DESTINATION "${PROJECT_SOURCE_DIR}/lib")
  install(FILES "${PROJECT_BINARY_DIR}/lib/lib${LIB_NAME}.so" DESTINATION "${PROJECT_SOURCE_DIR}/lib")

三、CMakeList构建Qt工程

1.设置开启MOC UIC RCC编译器

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")

2.添加qt模块 添加头文件路径 依赖库路径 库名称 Findxxx.cmake xxxConfig.cmake

find_package(Qt5Widgets CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME}  Qt5::Widgets)
<NAME>_FOUND   <NAME>_INCLUDE_DIRS   or    <NAME>_INCLUDES
<NAME>_LIBRARIE   or     <NAME>_LIBRARIES   or   <NAME>_LIBS
<NAME>_DEFINITIONS
===================================
find_package(PkgConfig)
pkg_search_module(Qt5Widgets REQUIRED Qt5Widgets)
target_link_libraries(${PROJECT_NAME} ${Qt5Widgets_LIBRARIES})
=====================================================
(pkg-config xxx a.默认usr/bin/*.pc  b.读取环境变量PKG_CONFIG_PATH  c.pkg-config --variable pc_path pkg-config )
(动态库 a.LD_LIBRARY_PATH b./etc/ld.so.conf c./lib  or /usr/lib)

四、CMakeList添加第三方库

1.编写编译安装脚本 命名为uchartdet_install.sh

cd libiconv-1.16
path=”`pwd`/../lib” #生成路径自己指定
./configure --enable-extra-encodings --prefix=$path --enable-static --disable-shared
make
make install

2.在第三方库third目录下编写CMakeList.txt

execute_process(COMMAND bash "${CMAKE_CURRENT_SOURCE_DIR}/uchartdet_install.sh" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

3.在上级CMakeList.txt添加add_subdirectory(third)

相关demo文档下载:https://download.csdn.net/download/wml00876/19671522

简单demo

#最低cmake版本
cmake_minimum_required(VERSION 3.0)                                                                               
#项目名
project(aqp)                                                                                                      
#引入文件
file(GLOB HEADS "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")                                                              
file(GLOB SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/*.qrc")                           
                                                                                                              
 #添加Qt模块                                                                                                       
find_package(Qt5Core REQUIRED)                                                                                    
find_package(Qt5Widgets REQUIRED)                                                                                 
                                                                                                                      
#创建可执行文件                                                                                                   
add_executable(aqp                                                                                                
            ${HEADS}                                                                                                  
			${SRCS}                                                                                                       
		)                                                                                                             
#引用路径,包含编译给定目标时需要使用的目录                                                                                                                 
target_include_directories(${PROJECT_NAME} PUBLIC                                                                 
${Qt5Core_INCLUDE_DIRS}                                                                                       
${Qt5Widgets_INCLUDE_DIRS}                                                                                    
)                             
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeList使用总结 的相关文章

  • Axios请求中Content-Type的使用总结

    Axios请求头中的Content Type常见的有3种 xff1a 1 Content Type application json 2 Content Type application x www form urlencoded 3 Co
  • ROS的CmakeList写法

    catkin是当前ROS的官方编译工具 catkin编译基于CMake xff0c 源代码以package为单位组织 xff0c 每个package必须包含package xml和CMakeList txt两个文件 1 package xm
  • 关于package.xml和CMakeList.txt的解读

    关于package xml和CMakeList txt的解读 前言一 关于package xml文件的讲解 xff1f 二 关于CMakeList txt文件的讲解1 必需的CMake版本 xff1a cmake minimum requi
  • Etcd 使用总结

    1 简介 Etcd API 特性 xff1a 原子性 xff1a 一个操作要么全部执行 xff0c 要么全部不执行一致性 xff1a 不论客户端请求的是哪个etcd服务器 xff0c 它都能读取到相同的事件 xff0c 而且这些事件的顺序也
  • CMakeList.txt

    一 Cmake 简介 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 二 常用命令 1 指定 cmake 的最小版本 cmake minimu
  • CMakeList 详解

    CMake 构建脚本是一个纯文本文件 xff0c 您必须将其命名为 CMakeLists txt xff0c 并在其中包含 CMake 构建您的 C C 43 43 库时需要使用的命令 如果您的原生源代码文件还没有 CMake 构建脚本 x
  • CMakeList.txt

    一个视频讲解 http v youku com v show id XMjc1MjE0MjEwNA 61 61 html cmake 语法设置路径 xff0c 配置库 xff0c 编译器标记 xff1a https www cnblogs
  • ROS的CMakeList编写

    参考这位博主 我的cmakelist包 在 home xxx catkin Drone src Flight Control ROS CMakeLists txt cmake minimum required span class toke
  • ROS学习 catkin CMakeList.txt详细介绍

    ROS中catkin CMakeLists txt的内容 CMakeList txt文件是CMake编译系统编译软件包过程的输入文件 任何CMake兼容包都包含一个或多个CMakeLists txt文件 xff0c 这些文件描述了如何编译代
  • CLion 生成CMakeList文件和include文件不存在问题

    今天导入在Clion上导入了一个其他开发环境下开发的项目 xff0c 虽然能看得到代码 xff0c 但是也只能看得到代码了 xff0c 想要代码跳转 xff0c 查看声明啥的都看不了 xff0c 编写错误也不会提示 xff0c 也不能编译执
  • CMakeList静态库多层嵌套问题 undefined reference to

    前言 被一个问题缠绕了很长时间 xff0c 这两天花精力好好研究了一下 xff0c 总算解决了 xff0c 翻过来看 xff0c 就是自己不注意造的很多小问题 我的想法是把一些代码封装起来 xff0c 但是有些部分要求能让现场工作同事有一定
  • cmakeList编译protobuf.pb.h时报错fatal error: google/protobuf/port_def.inc: No such file or directory

    写一个protobuf文件 xff0c 编译后会生成两个文件一个 cc和一个 h文件 export LD LIBRARY PATH 61 usr local lib protoc cpp out 61 forward protobuf pr
  • ireport的使用总结

    ireport的使用总结 截图居然都没显示出来 xff0c 如有需要可以到 xff08 http download csdn net detail czp0608 4140640 xff09 下载 相信很多java程序员们 xff0c 在开
  • CMake&CMakeList.txt

    1 各种关系 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt Makefile 文件 xff0c 在项目的编译时候需要用到的命令有 cmake make 我们本次想搞清楚他们之
  • firewall-cmd 使用总结

    firewalld的简要说明 firewalld firewall cmd firewall offline cmd它们Python脚本 xff0c 通过定义的在 usr lib firewalld下面的xml配置信息 xff0c 在启动时
  • CMakeList.txt写法

    ROS 创建并运行一个c 43 43 的demo xyzxyz576的博客 CSDN博客 目录 样例 解释如下 1 确定cmake最低版本需求 2 确定工程名 3 添加需要的库 4 添加需要的头文件 5 确定编译语言 6 设定变量 7 添加
  • 关于makefile与CMakeList的理解

    为了编译某一工程中的众多 c文件搞出来一个makefile可以批量编译 xff1b Linux下用Cmake也即CMakeLists txt文件 作者写的很清晰易懂
  • 从零学习GCC,Makefile,CMakeList编译

    近期想系统地学习一下C 43 43 软件开发 xff0c 因此记录一下自己的学习笔记 xff0c 方便复习 大多数内容都是整理搬运别的博主文章内容 xff0c 加上自己的理解归纳 如果大家想了解更深的内容或者有不明白的地方 xff0c 可以
  • Ubuntu下PyQt5使用总结

    因为工作中需要给交付团队开发桌面工具 xff0c 考虑到交付团队多使用Mac xff0c 调研了一下发现PyQt5可以实现跨平台 xff0c 满足工具开发需要 xff0c 就用其开发了桌面工具 现以ubuntu开发环境为例总结一下开发过程
  • Datax使用rdbmsreader支持clickhouse的读取

    参考链接 22条消息 使用datax的rdbmsreader实现读取clickhouse Sleten09的博客 CSDN博客 背景 想要把click house的数据源同步到HDFS 发现Datax没有clickhousereader组件

随机推荐

  • 什么是奇偶校验

    什么是奇偶校验 对数据传输正确性的一种校验方法 在数据传输前附加一位奇校验位 xff0c 用来表示传输的数据中 34 1 34 的个数是奇数还是偶数 xff0c 为奇数时 xff0c 校验位置为 34 0 34 xff0c 否则置为 34
  • Linux CentOS 7 elasticsearch 设置开机自启

    在 etc systemd system目录下创建elasticsearch service文件 span class token namespace Unit span Description 61 elasticsearch span
  • Centos7 设置开机自启的几种方式

    一 系统服务的方式 1 前提 xff08 1 xff09 首先要将需要自启的软件或应用注册成系统服务 xff0c 下面提供常用的软件注册系统服务的案例 nginx service 创建服务文件 vi usr lib systemd syst
  • ubuntu18.04 server配置 ip地址

    ubuntu18 04 server xff0c 启用了新的网络工具netplan xff0c 下面对齐配置参数进行介绍 1 其网络配置文件是放在 etc netplan yaml 缺省dhcp打开方式 xff0c 如果要配置静态地址 xf
  • Ardupilot基于UWB的定位飞行测试

    拖了许久的测试视频 xff0c 终于要发布了 xff0c 上个版本的代码有点问题 xff0c 没有考虑清楚UWB和NED坐标系的关系 xff0c 导致后面飞行故障不断 xff0c 这款UWB的坐标系为ENU坐标系 xff0c 飞机飞行的坐标
  • AutoBoat自动导航无人船

    AutoBoat 自动导航支持航线规划无人船 AutoBoat是一款功能强大自动驾驶无人船 xff0c 同时还可以搭配多款地面控制站使用 地面站中可以在线升级固件 调参 xff0c 使用一套全双工的无线数据传输系统在地面站与小车之间建立起一
  • PIXHAWK上安装PX4Flow光流传感器及调试过程

    小编最近刚调试完光流传感器 xff0c 效果非常理想 xff0c 无GPS情况下很稳定 小编把调试过程的过程和遇到的问题分享给大家 xff0c 希望大家少走弯路 在安装和调试光流传感器之前 xff0c 先保证旋翼机已经安装和调试完毕 xff
  • 正点原子STM32学习笔记——MPU6050介绍

    一 MPU6050简介 1 什么是MPU6050 xff1f MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件 xff0c 内带3轴陀螺仪和3轴加速度传感器 xff0c 并且含有一个第二IIC接口 xff0c 可
  • 【OFDM系列4】OFDM信号多径信道模型基础知识

    多径信道模型 Multipath Channel Scenario 信道脉冲响应 Channel Impulse Response CIR 信道的复基带脉冲响应如下所示 h t l 1 L a l
  • LACP负载分担配置

    网络拓扑图如下 交换机3的配置 Huawei int Eth Trunk 1 Huawei Eth Trunk1 mode lacp static xff08 负载分担模式设置为LACP模式 xff09 Huawei Eth Trunk1
  • 在 NVIDIA jetson tx2 上基于 realsense d435i 相机运行 vins 相关配置

    在 NVIDIA jetson tx2 上基于 realsense d435i 相机运行 vins 相关配置 一 tx2刷机二 安装librealsense xff0c realsense驱动1 安装依赖库2 从debian reposit
  • linux串口传感器处理接收不完整,数据丢失问题分析

    简介 因为当前项目需要在一个linux系统下进行串口传感器的收发工作 xff0c 该串口传感器的收发使用的是字节流专有协议 xff0c 按照每一个字节的十六进制编码来确定协议数据 按照以往的思路 xff0c 串口就是最简单的外设的思想 xf
  • STM32与上位机串口通讯的学习笔记(简明的数据帧设计方法)

    最近因为项目需要 xff0c 需要做一个STM32和Windows的串口通讯协议来交换数据 xff0c 本着追求极致的心态 xff0c 来讨论一下简明的数据帧的设计方法 数据的传输方式 对于很多单片机初学者而言 xff0c 可能他们接触到串
  • 通讯协议(modbus协议和serial读取数据)

    通讯协议 1 调试助手1 1 crc计算助手1 2 串口调试助手 2 使用serial节点读取数据3 modbus协议3 1 报文3 2 功能号3 2 1主机对从机写数据操作3 2 2主机对从机读数据操作 3 3 MODBUS报文模型 4
  • Qt5开发(一)使用记录

    Qt使用记录 一 QtCreator 快捷使用方式1 快速切换已打开的文件2 快速添加函数3 修改变量名 并应用到所有使用该变量的地方 4 选中光标所在的单词5 删除光标所在行6 其他快捷键7 QtCreator配置代码自动格式化8 快捷键
  • Windows10系统运行msconfig(系统配置)选择安全引导后,登录账户显示密码错误的一种较为简易的解决方法

    问题背景描述 在Windows10环境下 xff0c 由于前几天下载到一个带有极多捆绑软件的文件 xff08 常在河边走 xff0c 哪有不湿鞋 xff09 xff0c 为了删除一个流氓软件 xff0c 于是根据网上文章提示便运行 msco
  • 学习笔记-MATLAB的函数bwconncomp算法解析

    一 说明 bwconncomp函数的作用是在一个二值图像中找出每一个连通分量 xff0c 并返回一个结构体CC xff0c CC中包含了图像及连通分量的一些属性 笔者使用的MATLAB版本为2018a xff0c 且在该版本中 xff0c
  • PX环境搭建编译px4_fmu-v2_default相关问题的解决方法

    背景说明 笔者在ubuntu18 04下搭建PX环境时git clone的是较新版本的PX4 Autopilot链接在此 xff08 而目前网上的教程基本是较老版本的Firmware xff0c 两者文件分布不相同 xff0c 所以已有的方
  • PX4编译过程中报错通用解决办法

    背景说明 时刻两年 xff0c 再次配置PX4环境 xff0c 又踩了一遍坑 xff0c 过程中遇到报错真的是欲哭无泪 xff0c 但是解决完回头再来看其实问题并不复杂 本篇文章面向在PX4 Autopilot目录执行命令 make px4
  • CMakeList使用总结

    一 cmake功能介绍 cmake是跨平台编译工具 xff0c 编写简单好维护 xff0c 是make的高级用法 1 编写CMakeList txt文件 通过cmake生成Makefile文件 xff0c make生成可执行文件 静态库 共