【从零搭建Osgearth工程】01. 创建一个cmake+vs开发环境的跨平台osgearth工程

工程环境

cmake3.25.0+osg3.6.5+osgearth+QT5.12.8
开发工具:vs2019
由于项目牵涉跨平台移植的问题,故本例选择通过创建cmake工程完成方便的跨平台项目开发,初期开发工作在win10+vs2019环境下进行,但可以较方便的移植到linux、麒麟等环境下。

相关软件安装与环境配置

  1. 比较复杂的是osg和osgearth安装的部分,网上教程很多,选择步骤清晰详细的参照安装即可,不再赘述;
  2. 需要注意的是,安装好后需要将所有依赖环境统一放置在某个目录下,并配置环境变量,以笔者为例:
    OSGEARTH_DIR : E:/osgearth
    这样做的好处是,统一管理了后续开发涉及的include\lib\bin等环境,可以方便的为cmake工程配置依赖项;
  3. 此外,需要将OSGEARTH_DIR/bin目录添加到path环境变量中,这一步的目的同样是为了提前配置好开发时可能依赖的DLL;
    在这里插入图片描述
    一个完整的环境应至少包含上述include/lib/bin目录,且包含osg和osgearth安装过程提供的data文件夹。笔者建议,如果开发目的是搭建osgearth,可以将osg安装后的相关文件也统一拷贝在对应目录下,避免环境配置和添加库文件时不必要的繁琐步骤。

基于cmake的osgearth+QT工程搭建

终于进入正题啦!

1. 创建工程

最简单的方式是准备一个文件夹,在里面添加CMakeLists.txt和main.cpp两个空文件,如图:
在这里插入图片描述
初步创建的工程只有这两个文件即可。
通过vs2019打开该文件夹,经过一系列后台工作,就得到了一个cmake工程!
在这里插入图片描述
这里其他的.h和.cpp文件后续添加即可,ui文件同理。关于如何在cmake工程下编译.ui文件并正常读取ui_.h头文件,后续会一一讲解。

2. cmakelist文件编写

很好!现在我们已经有了一个cmake工程,让我们开发osgearth三维地球吧!
OK,朋友稍安勿躁,我懂找到这篇blog的你一定早就恨透了那些没有半点干货的水文。我们会真正【从零】搭建,一步步来。

  1. 一个cmake文件应该如何组织呢?首先:
# 指定最低cmake版本
cmake_minimum_required (VERSION 3.1)
# 添加文件路径,调用环境变量
set(OSGEARTH_DIR $ENV{OSGEARTH_DIR})
set(QTDIR $ENV{QTDIR})
SET(CMAKE_INCLUDE_CURRENT_DIR ON) #设置包含当前路径
# 添加头文件路径
include_directories(${QTDIR}/include)
# 添加库文件路径
link_directories(${OSGEARTH_DIR}/lib)
# 查找当前文件夹下的相关文件
FILE(GLOB SOURCE_FILES "./*.cpp") 
FILE(GLOB HEADER_FILES "./*.h") 
# 将源代码添加到此项目的可执行文件。
add_executable (${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES} ${WRAP_FILES})
# 链接库文件
target_link_libraries(${PROJECT_NAME}
	#Qt5::Widgets Qt5::Core Qt5::Gui
	#Qt5Widgetsd.lib
	#Qt5Cored.lib
	#Qt5Guid.lib
	qtmaind.lib
	Qt5OpenGLd.lib
	opengl32.lib
	glu32.lib
	osgEarth.lib
	osgd.lib
	osgDB.lib
	osgGA.lib
	osgUtil.lib
	osgViewer.lib
	OpenThreads.lib
	osgQOpenGL.lib
	osgText.lib
)

OK,无需多言,cmakelist的编写本质上是把vs自带的属性编辑工具能够实现的功能,通过其语法自己写出,转换成不依赖某个编辑器的跨平台版本,基本的语法都在上面啦。

  1. cmake+qt的实现
    很多朋友的问题可能卡在如何把qt整合进cmake工程。这里给出完整的写法:
FILE(GLOB UI_FILES "./*.ui")		# 查找当前文件夹中的ui文件
#添加Qt到cmake的相关设置
FIND_PACKAGE(Qt5 COMPONENTS Widgets Gui Core REQUIRED PATHS ${QTDIR})# 查找Qt5包,需要设置Qt5_HOME环境变量
set(CMAKE_AUTOMOC ON)				# 自动生成moc文件,可以省去QT5_WRAP_CPP命令
set(CMAKE_AUTOUIC ON)				# 自动生成ui.h文件,可以省去QT5_WRAP_UI命令
set(CMAKE_AUTORCC ON)				# 设置自动处理.qrc文件
SOURCE_GROUP("UI" FILES ${UI_FILES} ${WRAP_FILES})# 生成UI文件夹

同样不难~

  1. 最后,记录一个对读者可能有用的语句,也是我自己开发时的需求,也就是如何使得cmake工程,也具备vs里release环境下生成调试信息的能力:
# release下添加调试信息设置
ADD_DEFINITIONS( /Zi )
ADD_DEFINITIONS( /Od )
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG")

3. 搭建过程的tips

说起来简单,在实际开发过程中,很可能遇到各种问题,这里记录下来以供读者需要:

  1. 配置管理
    正如vs开发区分debug和release版本一样,cmake开发过程同样会面临需要一个release版本的问题。具体的实现,通过vs提供的配置管理工具即可,如图:
    vs配置管理工具
    笔者选择了配置了x64-release版本,其余同理。

  2. 管理dll链接路径
    在开发过程中,可能会遇到一个典型报错:

    (ucrtbase.dll) (**.exe 中)处有未经处理的异常: 请求了严重的程序退出

    这个问题在开发过程初期也困扰了笔者很长时间,实际很简单,也无需被网上大量垃圾blog的虚假教程搞晕,只要记清处理思路就能搞定类似bug了:
    会出现类似报错,一定是因为cmake配置过程中,你链接的lib库、DLL库和你选择的配置管理版本不匹配,挨个排查即可。具体来说,可能出现的情况有:

    1. 你安装了多个版本的QT,同时在环境变量path中,你目前使用的QTbin路径放在了其他版本QT路径的下面。
      这样会导致程序运行链接DLL的时候先找其他版本的库,而不是你需要的。因为是比较不容易发现的问题,故而列在第一点,供读者查阅。
    2. 你配置管理中选择了"release",但link的lib库是debug版本的,反之亦然。
      对于这个问题,有个相对一劳永逸的方法,就是不在cmakelist中通过target_link_libraries()方法进行lib库的链接,而是直接在代码中管理。当然,在cmake中实现配置管理也是可行的,这里不再赘述。
       #pragma comment(lib, "XXX.lib")
      

4. 总结

到此为止,一个完整的、可供开发的cmake工程就已经搭建好了。他可以实现所有vs+QT+osgearth环境下工程开发的需要,并兼有跨平台的优点。
下一篇blog,会在此基础上讲解,如何一步步搭建osgearth,已经如何在上面实现一系列功能。
如果对你有帮助,请点一个赞、收藏吧!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值