CMake学习小结

Windows 项目的 CMakeLists 编写 前言: 项目一直是以 .sln 解决方案打开和处理的,上传到 github 也是需要将 sln 文件包括到项目里,不太优雅(虽然方便),毕竟现在开源项目基本都是使用 CMake 做跨平台编译 因为项目是以 Windows 编译为主,就只写了 CMakeLists 中的 Windows 的部分,后续如果要跨平台的话,可以在此基础上拓展。 写这篇文章的主要目的是积累和分享学习经验,在寻找相关 vs ... 阅读详情

假定有vegagis工程,工程的目录结构如下:

#--vegagis
#  |--src 源文件目录
#     |--gui 界面工程,输出类型:dll,依赖于QT的QtCore、QtGui、QtXml
#        |--pending 工程中的源文件,不希望加入到工程中
#        ## 为了实现跨平台运行,win32和linux目录下实现的是同一套接口,win32不编译linux目录,linux下则不编译win32目录,但是工程中包含这两个目录
#        |--win32 win32下的实现
#        |--linux linux下的实现
#     |--app 应用程序,输出类型:exe,它依赖于gui
#  |--include 安装时头文件输出的目录
#     |--gui
#     |--app
#  |--bin 输出路径,存放dll和exe
#     |--Debug
#        |--plugins
#  |--build CMake的build路径,存放生成的工程文件等

#////////////////////////////////////////////
#vegagis目录下的CMakeLists.txt
#///////////////////////////////////////////

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

#工程名
PROJECT(vegagis)

#工程文件中使用相对路径
SET(CMAKE_SUPPRESS_REGENERATION 1)
SET(CMAKE_USE_RELATIVE_PATHS ON)

#支持IF(A) ELSE()的写法
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

#定义工程的顶级路径
SET(PROJDIR ${CMAKE_CURRENT_SOURCE_DIR})

#定义源文件目录
SET(SRCDIR ${PROJDIR}/src)

#设置输出路径
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

#设置安装路径
SET(CMAKE_INSTALL_PREFIX ${PROJDIR}/bin)

#定义头文件安装目录
SET(VGIS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/headers)

#根据操作系统不同而设置不同的路径
IF(WIN32)
 SET(GDAL_HDRS "E:/lib/gdal/include")
ELSE()
 SET(GDAL_HDRS "/home/sunsc/gdal/")
ENDIF()

#设置头文件的引用路径
INCLUDE_DIRECTORIES(
 ${GDAL_HDRS}
)

#设置引用库路径
SET(LIBS ${LIBRARY_OUTPUT_PATH})
LINK_DIRECTORIES(${LIBS})

#设置依赖库Qt4
SET(QT_MIN_VERSION 4.5.2)
FIND_PACKAGE(Qt4 ${QT_MIN_VERSION} COMPONENTS QtCore QtGui QtXml REQUIRED)
INCLUDE(${QT_USE_FILE})

#宏,实现visio studio的目录分组(过滤器)功能
macro(source_group_by_dir source_files)
    if(MSVC)
        set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})
        foreach(sgbd_file ${${source_files}})
            string(REGEX REPLACE ${sgbd_cur_dir}//(.*/)
//1 sgbd_fpath ${sgbd_file})
            string(REGEX REPLACE "/(.*/)/.*"
//1 sgbd_group_name ${sgbd_fpath})
            string(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup)
            string(REPLACE "/" "//" sgbd_group_name ${sgbd_group_name})
            if(sgbd_nogroup)
                set(sgbd_group_name "//")
            endif(sgbd_nogroup)
            source_group(${sgbd_group_name} FILES ${sgbd_file})
        endforeach(sgbd_file)
    endif(MSVC)
endmacro(source_group_by_dir)

#添加子目录
ADD_SUBDIRECTORY(src)

#////////////////////////////////////////////
#vegagis/src目录下的CMakeLists.txt
#///////////////////////////////////////////
ADD_SUBDIRECTORY(gui)
ADD_SUBDIRECTORY(app)
#添加依赖关系
ADD_DEPENDENCIES(APP GUI)

#////////////////////////////////////////////
#vegagis/src/gui目录下的CMakeLists.txt
#///////////////////////////////////////////

SET(TARGET_NAME GUI)

#预定义宏,-D选项
ADD_DEFINITIONS(-DVMAP_GUI_LIB)

#ui文件
SET(GUI_UIS vmapmainwindow.ui)

#源文件类型为*.h*和*.c*
FILE(GLOB_RECURSE GUI_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.c* ${CMAKE_CURRENT_SOURCE_DIR}/*.h*)
#FILE目前还不支持类似EXCLUDE的特性,所以Pending中的文件在上一语句中叶包括了,我们删除它
FILE(GLOB PENDING ${CMAKE_CURRENT_SOURCE_DIR}/pending/*)
LIST(REMOVE_ITEM GUI_SRCS ${PENDING}) #新生成的GUI_SRCS就不包括pending目录的源文件了

#参与QT MOC的头文件
FILE(GLOB_RECURSE GUI_MOC_HDRS vmapview.h transformlistener.hpp)

#设置资源qrc文件
SET (GUI_RCCS ui.qrc)

QT4_WRAP_UI(GUI_UIS_H ${GUI_UIS})
QT4_WRAP_CPP(GUI_MOC_SRCS ${GUI_MOC_HDRS})
QT4_ADD_RESOURCES(GUI_RCC_SRCS ${GUI_RCCS})

#由于.ui文件输出路径是在build目录下,所以需要添加${CMAKE_CURRENT_BINARY_DIR}目录
INCLUDE_DIRECTORIES(${SRCDIR}/gui ${CMAKE_CURRENT_BINARY_DIR})

#设置需要加入到工程中,但是不需要编译的源文件
IF (WIN32)
 FILE(GLOB_RECURSE PLATFORM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/linux/*")
ELSE()
 FILE(GLOB_RECURSE PLATFORM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/win32/*")
ENDIF()
FILE(GLOB_RECURSE EXCLUDE_SRC ${PLATFORM_SRC})
SET_SOURCE_FILES_PROPERTIES(${EXCLUDE_SRC} PROPERTIES HEADER_FILE_ONLY true) #设置源文件属性为不参与编译

#进行源代码分组
source_group_by_dir(GUI_SRCS)

#动态链接库
ADD_LIBRARY(${TARGET_NAME} SHARED ${GUI_SRCS} ${GUI_UIS_H} ${GUI_RCC_SRCS} ${GUI_MOC_SRCS})

TARGET_LINK_LIBRARIES(${TARGET_NAME} ${QT_LIBRARIES})

#//////////////////////////////////////
#vegagis/src/app下的CMakeLists.txt
#//////////////////////////////////////
SET(TARGET_NAME APP)

SET(APP_UIS vmapmainwindow.ui)

FILE(GLOB_RECURSE APP_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.c* ${CMAKE_CURRENT_SOURCE_DIR}/*.h*)

SET (APP_MOC_HDRS vmapmainwindow.h)

SET (APP_RCCS vmapmainwindow.qrc)

QT4_WRAP_UI(APP_UIS_H ${APP_UIS})
QT4_WRAP_CPP(APP_MOC_SRCS ${APP_MOC_HDRS})
QT4_ADD_RESOURCES(APP_RCC_SRCS ${APP_RCCS})

#添加头文件
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${SRCDIR}/apps/qt/${TARGET_NAME})

#源文件分组
source_group_by_dir(APP_SRCS)

#exe应用程序
ADD_EXECUTABLE(${TARGET_NAME} ${APP_SRCS} ${APP_RCC_SRCS} ${APP_UIS_H} ${APP_MOC_SRCS})

#TARGET_LINK_LIBRARIES语句必须放到ADD_EXECUTABLE语句之后,否则引起链接错误
TARGET_LINK_LIBRARIES(${TARGET_NAME} ${QT_LIBRARIES} GUI)


#其他
#1、输出路径的问题
#如果要修改输出路径,通常采用SET(LIBRARY_OUTPUT_PATH XXX)即可,但是在WIN32下,会自动放到${XXX}/Debug/Release目录下,比如有一个插件,希望在输出目录的plugins子目录下,但是如果设定为SET(LIBRARY_OUTPUT_PATH XXX/plugins),则文件输出目录为${XXX}/plugins/Debug,这显然不是我们希望的。做法是设置PREFIX,如SET_TARGET_PROPERTIES(abc PROPERTIES PREFIX plugins/)。同理,如果输出路径不管Debug、Release都放置一样,则设置PREFIX为../。

#2、头文件安装时按照目录层次存放
FILE(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h*)
FOREACH (HEADER ${HEADERS})
 STRING(REGEX MATCH "(.*)[///]" DIR ${HEADER})
 INSTALL(FILES ${HEADER} DESTINATION ${VGIS_INCLUDE_DIR}/${DIR})
ENDFOREACH(HEADER ${HEADERS})

CMake Tips - 在Visual Studio中按目录结构自动创建Filters(Source Groups) CMake作为构建系统可以轻松生成Visual Studio工程,这让我们的新项目可以不必维护一组专门的Visual Studio工程文件和sln文件了。但是CMake默认生成的工程文件中,只是笼统区分了头文件和其他源文件。对于大型项目,要在众多的源文件中找到想要的那个是很恼火的事情。对此,Visual Studio提供了filter机制来分类显示源文件。对于手工维护工程文件的项目,我们可以自己添... 阅读详情

相关推荐

CMake入门教程【高级篇】源文件分组(source_group)

CMake源文件分組source_group

小鱼酱的博客 1918

CMake source_group()命令

CMake作为构建系统可以轻松生成Visual Studio工程,这让我们的新项目可以不必维护一组专门的Visual Studio工程文件和sln文件了。对于手工维护工程文件的项目,我们可以自己添加filter,然后提交到代码库,并与其他成员共享。CMake也提供了可以生成filter的机制,就是source_group()命令。结合source_group(), file(), string()等命令,我们可以让实现CMake自动按目录结构生成filter。

我的博客 4891

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 416

CMake学习

假定有vegagis工程,工程的目录结构如下: #--vegagis # |--src 源文件目录 # |--gui 界面工程,输出类型:dll,依赖于QT的QtCore、QtGui、QtXml # |--pending 工程中的源文件,不希望加入到工程中 # ## 为了实现跨平台运行,win32和linux目录下实现的是同一套接口,win32不编译linux目录,linux下则不编译win32目录,但是工程中包含这两个目录 # |--win32 win3

sinat_42356311的博客 317

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 272

智慧楼宇解决方案-全套大合集

智慧楼宇解决方案,楼宇能耗-环境-设备统一管控解决方案。

byte58的博客 2592

Cmake学习小结

日期:2015年2月13日 10:02 星期五 农历 甲午 马年 十二月廿五 修改记录: 2015-02-26 补充10-12条 2015-03-31 补充第13条 正文: 想学Cmake有很长一段时间了,但是一直没有找到好的学习契机。根据以往的经验,在实际项目中去学习一个东西往往是最快的,在实际项目中通过问题与触发学习一个东西往往是印象最深刻的。最近发现了BullseyeCov

gande08的专栏 401

学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架

2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.youkuaiyun.com/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4....

kengkengkeng963的博客 3410

cmake 学习小结

假定有vegagis工程,工程的目录结构如下: #--vegagis #  |--src 源文件目录 #     |--gui 界面工程,输出类型:dll,依赖于QT的QtCore、QtGui、QtXml #        |--pending 工程中的源文件,不希望加入到工程中 #        ## 为了实现跨平台运行,win32和linux目录下实现的是同一套接口,win32不编译

lonelyrains的专栏 1930

高级图像增强——模拟雨天,雾,雪,阳光,阴影,运动模糊,畸变等14种效果,同步扩充标签文件

本文提供了一些高级的,特殊的图像增强方法,具体包括、光。

Limiiiing的博客 1308

ROSTCM6软件下载及语义网络分析详细操作教程(附网盘链接)

ROSTCM6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。

m0_64336780的博客 4万+

学习小结:QT、OpenCV、cmake配置相关资料

学习小结:QT、OpenCV、cmake配置相关资料前言OpenCV的下载cmake下载环境变量设置cmake 配置OpenCV 前言 最近在跟导师做一个项目,我负责的软件开发部分。我一直使用QT来进行软件界面设计。导师要求设计的软件要读取一个三维的数组文件.mat。查了很多多资料,发现要使用QT、OpenCV、matlab。 首先本文总结的是qt、OpenCV、cmake的配置。 OpenCV的...

Lin_Mengxuan的博客 683

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3966

【Linux】【编译】cmake相关调试方法小结

- 你可能需要对你的 CMake 构建过程或你由cmake构建的的C/C++ 代码进行调试。本文将介绍这两种情况的操作方式。

一介草民,只为生活。 1398

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3012

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Cmake小结

一、CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤: cmake make cmake 指向CMakeLists.txt所在的目录,例如cmake … 表示CMakeLists.txt在当前

weixin_43892514的博客 2632

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CMake教程小结

CMake教程小结 文章目录CMake教程小结简介主要功能摘要1. 生成执行程序核心代码命令行使用示例2. 生成库(旧式CMake)生成库其它核心代码3. 生成库(新式CMake)核心代码更改4. 基于源代码的安装与测试核心代码更改命令行使用示例5. 系统检测核心代码更改6. 添加自定义命令以及生成文件核心代码更改7. 构建安装程序核心代码更改命令行使用示例8. 将测试结果提交到Kitware的公共指示板核心代码更改命令行使用示例9. 混合静态和共享库核心代码更改命令行使用示例10. 生成器表达式,条件判断

一个工具的觉悟 775

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CMake小结

CMake小结 单文件编译 假设项目目录下,只有一个main.cpp,CMakeLists文件可以这么写 cmake_minimum_required(VERSION 3.0.0) project(main VERSION 0.1.0) add_executable(main main.cpp) 之后在项目目录下,新建build文件夹并进入,执行cmake … & make ,即可出现可执行文件main 多目录多文件编译 假设项目目录下,存在main.cpp文件,include&src两个

LunaticHeaven的博客 1113

VS2022 CMake报错解决小结

vs+cmake+linux工程的配置报了几个错误,花了一些时间,记录一下

xiaopang_love_study的博客 1万+

cmake语法小结

cmake小结: CMakeLists.txt 文件中不区分大小写 PROJECT(project_name) 定义工程名称语法:project(projectname [cxx] [c] [java])可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言 MESSAGE(STATUS, “Content”) 打印相关消息输出消息,供调试CMakeLis

阳光柠檬_的技术笔记 1894

CMake使用小结

CMake使用小结 指定本地库的位置 set(Qt5_DIR "path") list(APPEND CMAKE_PREFIX_PATH ${Qt5_DIR}) 设置编译输出的路径 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTO

北冥 1010

一文搞懂如何在CMake中使用Qt

一文搞懂如何在CMake工程中使用Qt

Copperxcx的博客 2万+
上一篇: 人生的苦与苦瓜的苦
下一篇: 每天多学习一点,再多学习一点
joyyoj
博客等级 码龄17年 8粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值