Ubuntu16.04系统下安装osg3.7+osgearth3.3

前言

所有看到我现在写的文章的人想必都在为安装osgearth3.4版本而发愁,而本人在尝试安装osgearth3.4版本时,发现了许许多多的问题,但在网络上发现相关的教程寥寥无几,安装过程极为的痛苦,不过在反复重装了几次之后,终于成功安装osgearth3.4,所以在这里记录了安装过程中遇到的各种问题并给出了相应的解决方案。
在接下来的教程开始前,可以先看看这几篇文章
https://blog.csdn.net/qq_31817955/article/details/108441612
https://blog.csdn.net/Cappuccino_jay/article/details/125070871

安装背景

1.首先在这里的各位,如果不是非要在ubuntu16.04系统下使用osgearth的话,那么我奉劝各位不要在ubuntu16.04系统下安装osgearth,因为ubuntu16.04实在过于陈旧,安装过程中不仅要安装许多新的安装包,还必须对底层的各种软件包进行升级,比如说cmake,gcc等底层软件包都需要进行升级,相当于凭空多了许多工作量,环境配置也更加繁琐。

2.本人在配置osg+osgearth前的环境配置为:Ubuntu16.04+Opencv4.5.4+qt5+CMake 3.5.1+gcc5.4.0+openGL(NVIDA驱动不确定是否需要安装,如果安装失败可以尝试)

3.安装过程中可能删除部分安装包,请谨慎

安装全过程

前置库的准备

考虑到整个安装过程中需要安装多个安装包,所以在此创建一个独立文件夹packages储存所有安装包

cd ~
mkdir ~/packages
cd ~/packages

更新CMake

CMake至少要更新到3.10以上 ,本文使用的cmake版本为3.22

升级gcc

一般来说,ubuntu16.04自带的gcc版本为5.4.0,但是编译osgearth3.3需要用到c++17,所以我们需要对gcc进行更新,版本至少为7.x,而我选择更新的版本为9.5.0,,可以查看gcc版本的命令为gcc --version
源码下载地址:https://bigsearcher.com/mirrors/gcc/releases/gcc-9.5.0/
详细教程:
https://www.shuzhiduo.com/A/kvJ3nRyDzg/
https://blog.csdn.net/weixin_45747535/article/details/125902856
这两篇文章是直接下载安装,最好还是使用源码编译方式进行安装,这两篇文章仅供参考
https://blog.csdn.net/ljdudujsw/article/details/123426214
https://blog.csdn.net/liyuan_669/article/details/122500454
https://blog.csdn.net/m0_60027682/article/details/125738907
这三篇文章都包含源码编译anzhau的操作方法,你们可以根据自身的环境进行配置,但千万要记住之前版本的gcc5.4.0千万别删,接下来的编译过程还用得着,注意自己新安装的gcc和原来的gcc可执行文件到底是在usr/local/bin文件夹下,还是在usr/bin文件夹下。当切换gcc版本时,发现只有一个版本可切换,那么很可能是没有添加就有的gcc-5的信息,可以使用命令

sudo update-alternatives --install /usr/bin/gcc g++ /usr/bin/gcc-5 50

记得不仅要添加gcc,也要添加g++,每次切换版本时,确保gcc和g++版本一致。
在接下来的安装过程中,默认版本为5.4.0,当要求使用c++17或是出现单纯的语法错误时,切换gcc和g++版本为9.5.0

升级gdal

由于osgearth比较高端,所以gdal也必须进行升级,我们可以通过命令

gdalinfo --version

查看gdal当前版本,ubuntu16.04默认版本为GDAL 1.11.3,而要想安装osgearth,gdal版本必须在2.3以上,经过升级之后目前我的gdal版本为GDAL 3.6.0

安装教程可以看这篇博客https://blog.csdn.net/qq_41848682/article/details/110912703,相关安装包可以在这篇文章中引用的另一篇博客中有详细的记载。

sqlite3安装

我安装的sqlite版本为SQLite version 3.39.2,如果sqlite3安装出现了一些问题,可以看看以下两篇博客
https://blog.csdn.net/u012850999/article/details/79534129
https://zy010101.blog.csdn.net/article/details/109636486?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109636486-blog-114717481.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109636486-blog-114717481.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=1这篇文章是使用apt-get install直接安装的,不推荐但是确实很方便,顺便介绍了sqlite3环境的使用方法,建议看看。

PROJ安装

我安装的PROJ版本为9.0.0,cmake编译。如果安装失败可以看看它们的官网https://proj.org/install.html,不过安装过程中可能会出现问题fatal error: goo/gtypes.h: No such file or directory,这是因为需要升级poppler,ubuntu16.04自带的poppler没有这个文件。

Poppler安装

poppler可以从官网:https://poppler.freedesktop.org/releases.html下载,里面不同的安装包都有着各自的要求,我这台电脑安装了qt5,选择的poppler版本为0.52,安装过程我是直接**./configure**,往往这个时候又会出现新的问题Could NOT find Freetype (missing: FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS),这也就意味着你需要安装freetype了。

freetype安装

安装过程中,要求freetype版本必须高于2.8,在这里我下载了freetype 2.10.4.tar.gz
下载官网:https://download.savannah.gnu.org/releases/freetype/
教程:https://blog.csdn.net/github_35807147/article/details/88972554
其实安装过程也就是

cd ~/packages/freetype2.10.4
./configure
make -j4
sudo make install

安装openscenegraph

osgearth可以理解为是openscenegraph软件包的一个扩展工具包,想要安装osgearth就必须先安装openscenegraph。
相较于osgearth,osg安装过程比较简单,在这里我也不过多赘述,有两种方法可以安装openscenegraph

1.直接安装

在终端输入

sudo apt-get install openscenegraph

一般这种方法可以直接成功安装openscenegraph3.7,但是考虑到接下来的osgearth的安装需要设置openscenegraph安装包内cmake文件中opengl的模式,以及在反复的安装过程中可能需要多次安装或者卸载openscenegraph,所以在此建议各位想要安装osgearth3.x版本的同胞,绝对不要为了图省事直接安装,而是要采用源码编译的方式进行安装。

2.源码编译安装

git clone https://github.com/openscenegraph/OpenSceneGraph //在github中下载openscenegraph安装包
cd OpenSceneGraph

在OpenSceneGraph文件夹下我们打开CMakeLists.txt文件,搜索关键词OPENGL_PROFILE,寻找到
**SET(OPENGL_PROFILE “GL3” CACHE STRING “OpenGL Profile to use, choose from GL1, GL2, GL3, GLES1, GLES2, GLES3”)**这一行代码,标记内容可能为GL2或其他的选项,但是在这里一律将标记内容修改为GL3,运行以下命令进行安装。

mkdir build
cd build 
cmake ../
make -j4
sudo make install

编译时间可能会比较长,需要耐心等待。确认一切安装成功后,尝试在终端输入以下命令

osgversion

如果安装成功的话,会出现以下内容

OpenSceneGraph Library 3.7.0

如果想要一部分openscenegraph资源的话可以去openscenegraph官网,去那里下载资源包OpenSceneGraph-Data-3.4.0.zip,里面还有许多模型文件(cow.osg)。

安装osgearth

第一步,在github上下载osgearth的安装包

打开packages文件夹,在当前文件夹下下载osgearth源码

cd packages
git clone https://github.com/gwaldron/osgearth //在github中下载osgearth安装包
cd osgearth
mkdir build
cd build 
cmake ../
make -j4
sudo make install

如果安装成功的话,终端输入以下指令

osgearth_version

就会出现

osgEarth 3.3.0 build 139

安装过程中可能出现的问题及对应解决方案

1.找不到文件glyphs.proto

这个文件找不到很正常,官网和github上的源码都没有这个文件,它需要我们自己生成,详细内容可以参照这个博主写的文章
https://blog.csdn.net/tanmx219/article/details/123909030
一般ubuntu系统会自带protocol buffer,我们可以输入命令protoc --version查看,本人电脑输入命令后的结果为

libprotoc 2.6.1

所以我们可以直接尝试输入以下命令

protoc -I=~/packages/osgearth/src/osgEarth --cpp_out=~ ~/packages/osgearth/src/osgEarth/glyphs.proto

文件gluphs.proto就会自动生成。

而如果电脑没有protocol buffer,就可以参考上面那个网站链接,去下载源码然后编译安装。至于软件版本问题,我按照上面那个版本安装openscenegraph也没有什么大问题。

2.在运行osg相关程序,比如osgviewer时,会出现以下警告error while loading shared libraries: libosgDB.so.202: cannot open shared object file: No such file or directory

首先可以先在电脑中搜索对应的文件,例如 libosgDB.so.202,如果在电脑中没有该文件那就重新安装openscenegraph;
而如果电脑确实有这个文件,但只是编译过程中无法检索到的话,就需要将动态库文件所在路径添加到/etc/ld.so.conf中,以下是我的ld.so.conf文件的内容,因为安装过程中使用默认路径,所以一般会新建一个文件夹usr/local来存储编译出来的文件,因此我们需要将对应路径添加到ld.so.conf文件中,当然,因为环境不同,你们电脑中对应路径可能与我的有所不同。

include /etc/ld.so.conf.d/*.conf
/usr/local/lib64
/usr/local/lib
/usr/local/lib/x86_64-linux-gnu

保存之后,输入命令sudo ldconfig,如果在完成上述操作之后,仍旧会出现相同的错误,那么可能是因为以前安装了不同版本的openscenegraph,又没有卸载干净,所以为了解决这个问题,建议各位将电脑中有关osg的编译文件全部删除,切记要手动删除,不要用类似autoremove之类的命令,仅仅删除那些.so文件就好。
可以参考文章http://blog.chinaunix.net/uid-22166872-id-4243708.html

3.运行程序时终端发出警告[osgEarth]* [Capabilities] Warning, OpenSceneGraph does not define OSG_GL3_AVAILABLE; the application may not function properly

这个问题的出现往往是因为安装openscenegraph时,没有修改CMakeLists文件的OPENGL_PROFILE值,按照上文的内容将其设为GL3,然后重新编译安装,就可以解决这个问题。

4.error: ‘OGRRegistryAll()’ was not declared in this scope

在源文件src/osgearth/Registry.cpp中添加头文件#include <ogrsf_frmts.h>

5.使用osgviewer显示cow.osg模型,发现牛身一片漆黑,终端还会报以下错误

Warning: Material::apply(State&) - not supported.
Warning: detected OpenGL error 'invalid enumerant' at after RenderBin::draw(..)

就我个人建议,习惯就好,会出现这样问题的原因是因为opengl_profile采用了GL3模式,但是开发人员很明显没有考虑到更换模式之后那些例子(osgviewer)也没法用,所以没有对应的处理代码,不过其中一部分问题还是可以解决的。

在模式切换为GL3之后,就没有办法使用渲染管线的方法处理,就必须使用shader编译着色器,关于glsl(opengl shader language)的具体语法可以去opengl官网进行学习,不过在osg的应用部分可能会在我的后续文章中出现,在这里不过多赘述。总之,在多次的实验中可以确认,这个牛之所以是黑色的,与它的底层代码有关,无论怎么修改shader,只要它有关纹理的底层代码不变,就无法让牛变成彩色。

而关于Material::apply的警告完全是因为使用了material的类,而在GL3模式下Material类的代码基本上已经退环境了,勉强还可以用,但是还有像上面一样的警告,而cow.osg模型中依旧使用了material类,所以想要解决这个问题,要么重新读取cow,osg数据,再自行编辑shader,重新创造一个模型,要么直接去底层源码material.cpp中注释掉警告代码,再重新编译安装。

而这个警告信息**detected OpenGL error ‘invalid enumerant’ at after RenderBin::draw(…)**是唯一能够完美解决的问题,可以在OpenSceneGraph/examples/osgsimplegl3.cpp中找到解决问题的代码,

const std::string version( "3.0" );\\3.1也可以,其他不行
traits->glContextVersion = version;

6.安装过程中出现

/usr/include/pngconf.h:383:12: error: ‘__pngconf’ does not name a type
  383 |            __pngconf.h__ in libpng already includes setjmp.h;
      |            ^~~~~~~~~
/usr/include/pngconf.h:384:12: error: ‘__dont__’ does not name a type
  384 |            __dont__ include it again.;

直接sudo apt-get install libpng16-dev libtiff5-dev libjpeg-dev

7.freetype安装后出现

Make Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find Freetype (missing: FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS)
  (Required is at least version "2.8")
Call Stack (most recent call first):

将之前的freetype文件手动删除干净然后重装

8.ubuntu自带的fontconfig不给力

No package 'fontconfig' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables FONTCONFIG_CFLAGS
and FONTCONFIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

最后的方法:重装fontconfig,版本与ubuntu自带fontconfig一致,我的电脑ubuntu16.04系统中fontconfig版本为2.11.94

9.OpenJpeg

缺少这个库就去https://www.linuxfromscratch.org/blfs/view/svn/general/openjpeg2.html下载OpenJpeg2.5.0,cmake编译安装

10.gdal编译时gcc版本问题

Linking C executable test_include_from_c_file
../../libgdal.so.31.3.6.0: undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()@GLIBCXX_3.4.26'
../../libgdal.so.31.3.6.0: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
collect2: error: ld returned 1 exit status
autotest/cpp/CMakeFiles/test_include_from_c_file.dir/build.make:97: recipe for target 'autotest/cpp/test_include_from_c_file' failed
make[2]: *** [autotest/cpp/test_include_from_c_file] Error 1
CMakeFiles/Makefile2:11674: recipe for target 'autotest/cpp/CMakeFiles/test_include_from_c_file.dir/all' failed
make[1]: *** [autotest/cpp/CMakeFiles/test_include_from_c_file.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2

尝试切换版本,gcc5.4和gcc9.5都可以试试看,在我的电脑里编译gdal时一定要将gcc和g++改为5.4.0版本,编译osgearth则需要使用c++17,即需要gcc7.x版本以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值