cmake使用

news2024/10/6 6:05:08

1. cmake概述及例子

CMake快速入门
cmake、qmake、cl之间关系

1.1 各种cmake

cmake根据CMakeLists.txt生成makefile,make根据makefile行编译。

1.1.1 最简cmake:生成可执行程序(一个文件)

#CMakeLists.txt
cmake_minimum_required(VERSION 2.8.9)  	#指定cmake最低版本 
project (hello)							#指定项目名称
add_executable(hello helloworld.cpp)	#指定编译一个可执行文件
mkdir build
cd build
cmake ..  或 ccmake ..				#生成Makefile文件
make -j8							#根据Makefile编译
make install						#安装

1.1.2 生成可执行程序(带目录)

cmake_minimum_required(VERSION 2.8.9)
project(directory_test)
include_directories(include)					#添加头文件搜索路径
#set(SOURCES src/mainapp.cpp src/Student.cpp)  	#手动添加源文件
file(GLOB SOURCES "src/*.cpp")					#添加源文件
add_executable(testStudent ${SOURCES})			#生成可执行文件

1.1.3 生成动态库(带目录)

project(directory_test)
set(CMAKE_BUILD_TYPE Release)
include_directories(include)				#添加头文件搜索目录
file(GLOB SOURCES "src/*.cpp")				#添加源文件
add_library(testStudent SHARED ${SOURCES})	#生成库文件(动态库)
install(TARGETS testStudent DESTINATION /usr/lib)	#安装库文件

1.1.4 生成静态库(带目录)

cmake_minimum_required(VERSION 2.8.9)
project(directory_test)
set(CMAKE_BUILD_TYPE Release)
include_directories(include)
file(GLOB SOURCES "src/*.cpp")
add_library(testStudent STATIC ${SOURCES})			#生成静态库
install(TARGETS testStudent DESTINATION /usr/lib)	#安装静态库

1.1.5 生成可执行程序(使用共享库)

#include"Student.h"
int main(int argc, char *argv[])
{
   Student s("Joe");
   s.display();
   return 0;
}
cmake_minimum_required(VERSION 2.8.9)
project (TestLibrary)
set ( PROJECT_LINK_LIBS libtestStudent.so )
link_directories( ~/exploringBB/extras/cmake/studentlib_shared/build ) 		#添加库搜索路径
include_directories(~/exploringBB/extras/cmake/studentlib_shared/include)	#添加头文件搜索路径
add_executable(libtest libtest.cpp)
target_link_libraries(libtest ${PROJECT_LINK_LIBS} )	#插入共享库,必须在add_executable之后

1.1.6 综合示例

1.2 cmake与qmake

cmake和qmake对比
cmke转qmake例子
qmake转cmake(lib)
cmake与qmake例子如下:
cmake:

cmake_minimum_required(VERSION 3.10)
project(osganimate)
include_directories("xx/osg/build/include")
link_directories("xx/osg/build/lib")
file(GLOB OSG_LIBS "xx/osg/build/lib/libosg*")
add_executable(${PROJECT_NAME}  osganimate.cpp)   
target_link_libraries(${PROJECT_NAME} -lOpenThreads ${OSG_LIBS})

qmake:

QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = osg_qt_test
SOURCES += \
    osganimate.cpp

OSG_LIBS_PATH = xx/osg/build/lib/
DEPENDPATH += xx/osg/build/lib/
INCLUDEPATH += xx/osg/build/include
LIBS += \
    -L $$OSG_LIBS_PATH -losgAnimation   \
    -L $$OSG_LIBS_PATH -losgDB          \
    -L $$OSG_LIBS_PATH -losgFX          \
    -L $$OSG_LIBS_PATH -losgGA          \
    -L $$OSG_LIBS_PATH -losgManipulator \
    -L $$OSG_LIBS_PATH -losgParticle    \
    -L $$OSG_LIBS_PATH -losgPresentation\
    -L $$OSG_LIBS_PATH -losgShadow      \
    -L $$OSG_LIBS_PATH -losgSim         \
    -L $$OSG_LIBS_PATH -losg            \
    -L $$OSG_LIBS_PATH -losgTerrain     \
    -L $$OSG_LIBS_PATH -losgText        \
    -L $$OSG_LIBS_PATH -losgUI          \
    -L $$OSG_LIBS_PATH -losgUtil        \
    -L $$OSG_LIBS_PATH -losgViewer      \
    -L $$OSG_LIBS_PATH -losgVolume      \
    -L $$OSG_LIBS_PATH -losgWidget      \
    -L $$OSG_LIBS_PATH -lOpenThreads

QMake 和 CMake 的思路是类似的,无非是添加头文件路径和库路径,然后链接指定的库,QT 的 Pro 文件(qmake)貌似不太支持通配符的写法。

2. cmake语法

2.1 常用命令

指令意义
CMAKE_MINIMUM_REQUIREDcmake最低版本要求
PROJECT
SET设置变量: set(SRC_LIST main.cpp test.cpp)
MESSAGE
ADD_EXECUTABLE生成可执行文件
ADD_LIBRARY生成库文件
ADD_SUBDIRECTORY添加源文件子目录
INCLUDE_DIRECTORIES添加头文件搜索路径
LINK_DIRECTORIES添加库搜索目录
TARGET_LINK_LIBRARIES插入共享库
INSTALL安装二进制、动态库、静态库、文件、目录、脚本等
SUBDIRS
add_compile_options增加源文件的编译选项: -fPIC, -fpic, -fpie, -fPIE
ADD_DEFINITIONS为源文件的编译添加由-D定义的标志: add_definitions(-DFOO -DBAR …)
ADD_DEPENDENCIES添加依赖
ADD_TEST
ENABLE_TESTING
AUX_SOURCE_DIRECTORY将dir目录下所有源文件名字保存在变量varialble中:aux_source_directory(. DIR_SRCS)
EXEC_PROGRAM
FILE
INCLUDE
FIND_FILE
FIND_LIBRARY
FIND_PATH
FIND_PROGRAM
FIND_PACKAGE查找依赖包:find_package(Protobuf REQUIRED)
list追加或者删除变量的值:
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
install(TARGETS xx libxx.so libxx.a
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
        INSTALL_DIR DESTINATION  ${CMAKE_INSTALL_LIBDIR})

安装路径可以通过CMAKE_INSTALL_PREFIX设置

#目录拷贝
install(DIRECTORY xx/cofnig  DESTINATION ${CMAKE_INSTALL_PREFIX}/)

#文件拷贝
install(FILES xx DESTINATION ${CMAKE_INSTALL_PREFIX}/)
files(GLOB dep_libs "xx/xx/*.so*)
install(FILES dep_libs     DESTINATION ${CMAKE_INSTALL_PREFIX}/)

#编译过程中执行命令(非cmake时执行)
install(CODE "messge(\”xxxx\"))
install(CODE "execute_process(COMMAND bash -c \"cp xx/*.so ${dst} -rf\") ")

,

2.2 常用变量

SET(SRC_LIST main.cpp) 	#定义变量
${SRC_LIST}				#引用变量
变量意义
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR
这三个变量指代的内容是一致的,如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR
这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。
也就是在 in source 编译时,他跟 CMAKE_BINARY_DIR 等变量一致。
CMAKE_CURRENT_SOURCE_DIR指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。
CMAKE_CURRRENT_BINARY_DIR如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,
如果是 out-of-source 编译,他指的是 target 编译目录。
使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。
CMAKE_CURRENT_LIST_FILE输出调用这个变量的 CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE输出这个变量所在的行
CMAKE_MODULE_PATH这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。
比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了。
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH
分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
PROJECT_NAME返回通过 PROJECT 指令定义的项目名称。
CMAKE_CXX_STANDARDSET(CMAKE_CXX_STANDARD 14):设置c++版本
CMAKE_BUILD_TYPESET( CMAKE_BUILD_TYPE Release):设置编译方式
 #指定编译选项
 CMAKE_C_FLAGS : 			指定gcc编译选项,如-02 ,-g,当然也可用通过add_definitions设置。
 CMAKE_CXX_FLAGS:			指定g++编译选项。
 CMAKE_C_FLAGS_DEBUG:		指定debug版本编译选项

 #指定链接选项
 CMAKE_EXE_LINKER_FLAGS
 CMAKE_MODILE_LINKER_FLAGS
 CMAKE_SHARED_LINKER_FLAGS
 CMAKE_STATIC_LINKER_FLAGS

 #指定编译器
 CMAKE_C_COMPILER:			指定C编译器,如gcc
 CMAKE_CXX_COMPILER:		指定C++编译器,如g++
 BUILD_SHARED_LIBS:			指定默认生成库文件类型,on:动态库,off 静态
 CMAKE_BUILD_TYPE:			设置编译类型,如Debug、Release

 #指定RPATH相关选项,如果为true,则关闭rpath功能
 CMAKE_SKIP_RPATH;			构建和安装期间
 CMAKE_SKIP_BUILD_RPATH:	构建期间
 CMKAE_INSTALL_RPATH:		安装期间
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../map_common/lib)   #module库
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../map_common/lib) 	#静态库
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../bin)				#可执行

2.3 系统变量

$ENV{NAME}			#引用系统环境变量
MESSAGE(STATUS "HOME dir: $ENV{HOME}")
变量意义
CMAKE_INCLUDE_CURRENT_DIR
自动添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到当前处理的 CMakeLists.txt。相当于在每个 CMakeLists.txt 加入:
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确实跟系统发生冲突时可以提供一些帮助。
CMAKE_INCLUDE_PATH
CMAKE_LIBRARY_PATH
我们在上一节已经提及。

2.4 控制指令

2.4.1 IF

2.4.2 while

2.4.3 foreach

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十章 LCD触摸…

第十一章 建立语义化版本并提交组件库到NPM仓库

语义化版本是这样规定的。 版本格式&#xff1a;主版本号.次版本号.修订号&#xff08;MAJOR.MINOR.PATCH&#xff09;&#xff0c;版本号递增规则如下&#xff1a; 主版本号&#xff1a;当你做了不兼容的 API 修改&#xff1b;次版本号&#xff1a;当你做了向下兼容的功能性…

springboot+vue毕业生离校系统

目 录 摘 要 I 目 录 III 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 Java技术介绍 4 2.2.3 mysql数据库介绍 4 2.2.4 …

盘点程序员的花式赚外快的骚操作

2022世界杯比赛难得如期开幕了&#xff0c;卡塔尔王子的表情包想必大家已经看到眼晕。 我拿2200亿和你玩&#xff0c;你踢一个0&#xff1a;2过不过分啊~ 现实中的投资可不比卡塔尔王子的表情包失落更多&#xff0c;毕竟投资有风险入行需谨慎。 然而悲惨的事实是&#xff0c;…

[附源码]SSM计算机毕业设计新生入学计算机配号系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

企业若要实现预期广告推广效果,必须做好这六个步骤

在网络营销中&#xff0c;软文营销是一种最常用的营销手段。 我们知道&#xff0c;很多公司都是用软文进行广告推广。 然而&#xff0c;许多公司都觉得&#xff0c;软文营销并不是一件容易的事情&#xff0c;因为它不仅要有高品质的内容&#xff0c;还要有一定的操作能力&#…

CAD最常用的快捷键大全来啦

CAD快捷键的使用能够让我们加快画图的速度&#xff0c;但是想想CAD中有那么多的功能命令&#xff0c;所以CAD快捷键是很多的&#xff0c;想要完全记住是不可能的&#xff0c;这里就总结了常用的CAD快捷键命令&#xff0c;可能不全但是很实用。 一、常用绘图快捷键 最基本的一…

低代码与mes生产管理系统:功能篇

随着信息技术的发展和应用,信息系统在企业中的使用也越来越广泛。不仅可以使企业内部和企业间的信息流通更为便捷和频繁&#xff0c;同时可以提高管理的水平&#xff0c;有助于提高企业的生产效益。其中mes生产管理系统就是美豳的调查资询公司AMR(Advanced Manufacturing Resea…

牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法

文章目录一&#xff1a;牛顿法 &#xff08;Newtons method&#xff09;1&#xff1a;概述2&#xff1a;牛顿方向与牛顿法3&#xff1a;牛顿法的基本步骤4&#xff1a;举例二&#xff1a;高斯牛顿法 &#xff08;Gauss–Newton algorithm&#xff09;1&#xff1a;概述2&#x…

若依、多选框前后端处理,MyBatis处理多对多关系

背景 很经典的CRUD&#xff0c;整理下笔记。 后端 实体类 /*** 专业方向主键&#xff0c;用于下拉框搜索*/private Long disasterTypeId;/*** 专业方向*/private List<DisasterType> disasterType;业务层 /*** 新增专家信息库** param expertInfo 专家信息库* return 结…

mac pro M1(ARM)安装:php开发环境

0. 引言 最近在处理各个语言的加密算法&#xff0c;正好需要安装php环境&#xff0c;特此记录&#xff0c;以供后续参考 1. 安装php 1、安装php包管理工具composer brew install composer2、安装php brew install php # 同时可以指定版本安装 brew install php8.0 # 查…

基于Java+SpringBoot+Mybatis+Vue+ElementUi的航空公司电子售票系统

项目介绍 本系统是利用Spring Boot框架而设计的一款结合用户的实际情况而设计的平台&#xff0c;前端利用VUE技术开发&#xff0c;将可供教师和管理员来使用的所有界面来显示出来&#xff0c;利用Java语言技术来编程实现用户和管理员所执行的各类操作业务逻辑&#xff0c;以My…

在MacOS上实现两个网络调试助手的UDP通信测试

文章目录一、背景二、网络调试助手软件三、UDP通信过程一、背景 因为有一个项目要中会使用本机中两个应用程序之间的UDP通信。 因此本文记录一下怎么在MacOS上实现两个网络调试助手的UDP通信测试。 二、网络调试助手软件 我使用的网络调试助手软件是&#xff1a;网络调试助…

Revit 中参数化多边形的画法?

Revit 中参数化多边形的画法 问题提出 :在 Revit 中&#xff0c;系统画多边形的命合都无法参数化&#xff0c;网上有“六边形”参数化的画法教学 ( 这个教学被收入《每日一技》第 76期“Revit 中族编辑时可控六边形的画法详解”)&#xff0c;却对任意多边形无可奈何。 网上及前…

Spring-全面详解(学习总结---从入门到深化)

目录 Spring简介 Spring体系结构 IOC_控制反转思想 IOC_自定义对象容器 IOC_Spring实现IOC IOC_Spring容器类型 ​ 容器实现类 IOC_对象的创建方式 使用构造方法 使用工厂类的方法…

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析(判断题)2022年9月

2022年9月scratch编程等级考试一级真题 判断题(共10题,每题2分,共20分) 26、一个角色只能包含一个造型 答案:错 考点分析:考查角色造型,一个角色可以有多个造型,所以错误 27、我们可以根据需要将角色的任意一点设为造型中心 答案:对 考点分析:考查角色造型,角色…

CC1310F128RSMR Sub-1GHz射频微控制器 - MCU 433MHz 868MHz 915MHz ULP Wireless MCU

CC1310F128RSMR Sub-1GHz射频微控制器 - MCU 433MHz 868MHz 915MHz ULP Wireless MCU CC1310设备是德州仪器公司生产的一款性价比高、超低功耗、Sub-1GHz射频设备,这是SimpleLink的一部分,微控制器&#xff08;MCU&#xff09;平台。该平台包括Wi-Fi&#xff0c;蓝牙低能耗&am…

世界杯中隐藏的IoT物联网黑科技

世界杯首个大冷门上演&#xff01;&#xff01;夺冠热门阿根廷竟然一比二输给了沙特队&#xff0c;实在让人始料未及&#xff0c;让不少球迷都在黯然神伤。 回过头看&#xff0c;上半场4粒进球&#xff0c;被判越位无效的有3粒。整场比赛累计7次越位判罚&#xff0c;超过了上届…

APS智能排产系统的优势

APS智能排产系统是通过同步考虑多种有限能力资源的约束&#xff0c;依据各种预设规则&#xff0c;针对解决&#xff1a;客户订单交期评估与答复、人工排产效率低、设备资源利用率低、物料计划与生产计划脱节、生产计划执行率低、库存积压与生产缺料等相关问题&#xff0c;依靠严…

WebRTC技术专题(2)【大势所趋,迈向认识 WebRTC 的第一步】

每日一句 人生的挑战&#xff0c;无处不在&#xff0c;满怀信心&#xff0c;轻装上路&#xff0c;明天永远是充满希望的战场。 承接上文 承接上文的内容介绍完相关WebRTC技术的概念和发展历程后&#xff0c;开始初步摸索一下相关WebRTC技术的功能和原理。 技术回顾 WebRTC概念…