关于osg,osgEARTH etc.开源库如何编译的一个小结

非常有幸,在老师的指引下我和开源世界结缘...倾心于其鲜活的生命力,源源不断的创新力,但是事情往往是有两面性的,在开源库来讲,就是他的使用还是比较麻烦,不像那些商业软件那样帮你打点好一切,在这里,一切你想要的都要自己去搞定,或许你将为打造一个开发环境而耗费一天,甚至一个礼拜。

下面我就把我在编译这些库的过程和感受作一个记录,今天刚完成osgEARTH的编译,为了完成osgEARTH的编译我用了整整一天一夜的时间,在这个过程中大部分的时间都用在寻找支撑库和第三方库,其次就是等待编译过程结束。

如果要给开源库作一个分类的话,那么我目前接触过的有友好型的,一次config,一次make就能解决问题,像Qt,OpenCV,PCL这样的,大量的第三方库都会提供给你;自立更生型,告诉你用到了哪些库,自己去找,自己编译,要么使用,osgEARTH就属于这种的,同样还有OSG等;会意型,这或许是开源的最高境界了,即便官网上也不会贴出如何编译源码的步骤,那好吧,全靠自己理解了。目前这一类的好像都比较小,zlib,sqlite这样的。不论哪种,首先应该找到相关的文章,在编译osgEARTH时我就根据download参考了一下这三篇文章:

1,OpenSceneGraph在Visual Studio 上安装,链接点击Support/PlatformSpecifics/VisualStudio –osg

2,另外一篇来自博客园osgearth+vs2010安装

3,还有来自github的Cook Book OSGE Installation · updraft/updraft Wiki · GitHub

在编译CGAL的时候我就参考了如下几篇文章:

1,Installing CGAL and related programs on Windows operating system

2,Installation Manual

3,安装CGAL 3.6.1

如有疑问还可以参考我的博客装CGAL与解决"QWidget: Must construct a QApplication before a QPaintDevice". 问题,要更多文章的话可以参考CGAL编译配置

最好就是里列一个表,把链接和需要的支撑库都列清楚。然后对号入座,我在编译osgEARTH的时候真的被那些支撑库搞得头昏脑胀,因为我发现,这个库的支撑库还是一种开源库,那么你又要去编译,至少有三重啊!!比方说,osgEARTH需要osg的支持,osg则需要gdal的支持,gdal的运行需要proj4的支持,像CGAL中,三维显示需要QGLviewer,QGLviewer需要Qt支持,Qt又需要其它的类似SQLite等开源库的支持,吧啦吧啦。每一个环节都不能有差错,不胜其烦。

而像Qt,PCL和OpenCV这样的库在配置上给用户带来了很大的方便,只需运行下载好的安装包针对特定的编译器配置路径和一些必要的参数即可。然而如何应付这些

首先,获取支撑库:
osgEARTH需要的支撑库列表在osgearth+vs2010安装中有详细列出,这里不再赘述。

CGAL的支撑库列表

Boost,Qt4,zlib,GMP,MPFR,其中后两个CGAL帮我们搞定了,你也可以通过CGAL的下载目录找到它们。 VirtualPlanetBuilder支持库列表

GDAL,OSG,zlib,……

osg的支撑库列表可以在这里找到:

OpenCV和PCL等都是可以在其下载网站上下载到第三方库的,这里也就不一一列出,但凡找支撑库,我们可以通过各种途径去下载,并集中到我们的根目录下来一一编译,得到支撑库,Windows环境下,一般是dll、lib和h头文件通常被放置在bin、lib和include文件夹下。ok,在我已经完成第二步之后,就要进入到编译环节,这是一个煎熬的过程,有等待有报错…… 编译过程中有许多问题要注意,大多数集中于如何处理路径的问题上,设置路径与目标(预想)路径是否匹配,其次是库的版本,尤其是Release和Debug之间出现了差错,即使可以完成配置,在编译器上也会给出一大堆的错误。还有一些主要是开发者的失误。在这一过程中我们需要引入新的工具,CMake,它可以通过CMakelist,用户填入的表项来创建sln文件,即集成路径,把所有的路径都配置给编译器。

1、osgEARTH需要GDAL的支持,但是GDAL在编译完成后并没有很清晰的标记debug和release,参考github文章中的说明最好使用gdal_i.lib作为debug链接库,而动态库就没有什么要紧的。

2、在应用GEOS编译osgEARTH的时候也存在同样的问题,一般还是用libgeos.lib作为debug的链接库;当然,如果你下载了预编译的支持库,那么就会有明确的D标记作为debug下的链接库如osgearthd.dll,没有标记的一般是Release库osgearth.dll

3、CGAL在编译的时候要用Qt和Boost我用了Qt 4.8.0 RC和boost 1.4.8结果这两个库冲突了,后来google了一下,发现Qt在它的moc工具代码有问题,在Qt4.8.0 的路径下找到../src/tools/moc/main.cpp修改第192行,在此处加一句pp.macros["BOOST_TT_HAS_OPERATOR_HPP_INCLUDED"]; // rh#756395 ;然后自己重新编译一遍Qt就好了。 4、默认情况下GDAL的编译使用的是sln文件目录下的nmake.opt作为路径配置参考的,那么我们需要通过修改其中的参数来完成订制,一般GDAL_HOME这个变量会比较重要,关系到编译结果的位置,顺便在默认的情况下,GDAL是不会产生include和lib文件夹的,用户可以自行创建,将alg,apps,brige,frmts,gcore,ogr,port等文件夹下的.h和.lib文件分别放入include和lib中。还有一个重要的参数是MSVC_VER 如果是Visual Studio 2010的话就是1600,向下的.net VS依次减100,作为版本号。

5、在使用SQLite3的时候要注意它本身没有包含.lib文件,在VS prompt 命令行下,导航到sqlite3所在的目录中,使用 LIB /DEF: sql3.def处理,完成之后就可以在相同的文件夹下看到sqlite3.lib。

6、在使用Visual Studio 2010构建这些库的时候还可以使用build菜单栏下的batch build,在弹出的对话框中选择ALL_BUILD项目就可以完成该解决方案下的所有项目的构建,如没有这个项目,用户就必须自己去勾选了,在构建完了之后用户还可以通过构建INSTALL项目完成安装过程,这个过程会产生一个标准的文件目录,包含了bin,include和lib。当然,有些项目并没有这一项,GDAL就是。

7、使用CMake的时候有一点需要注意,如果需要额外加入项目,比如ZLIB_INCLUDE_DIR和PNG_LIBRARY等项目,而在此之前你已经configure了,那么务必在设置之前将CMake关闭,将构建目录下的CMakeCache.txt删掉,重启CMake,在重新configure之前,将所需的目录添加到CMake中。BTW:介绍一下CMake这个工具,在构建开源库的过程中,你可以看到各式的凌乱,CMake主要的功能就是将所有的路径构建好,然后交给编译器处理,避免用户直接手动配置编译器路径,这和makefile有异曲同工之效。在使用cmake时只要将工程中CMakeLists.txt文件拖放到CMake_GUI中,点击configure按钮并在弹出的对话框中选择对应的编译器,Visual Studio 10代表visual studio 2010,进行配置知道通过构建,窗口显示"configure done"字样,然后点击generate按钮就可以生成.sln文件。

8、在构建VirtualPlanetBuilder时,会出现一些异常,这是因为写这个代码的程序员漏了一个头文件没有包含进去,而实际上在新代码中这个没有包含的支撑头文件被用到了,故而我们需要在../src/vpb/SpatialProperties.cpp中加入#include <osgDB/fstream>即可

9、牢记一点,无论如何都要让编译器找到那些支撑库,不管使用CMake,makefile还是编译器中设置VC++ directory和Linker下的Input项。这些目前都只是在Windows平台下实践过,至于Linux下怎么实现我想与以上几点应该差不多吧。

10、最后,顺便说一句,如果E文不是很好的话,在此我提供一个网址,是微软的英库技术支持的一个翻译网页的网页,你只要按照步骤将这个网页作为收藏,以后遇到不懂的语言都可以通过它来翻译,当然如果你是IE(9以上)的铁杆用户,你也可以在网页上右键单击选择 使用必应翻译 即可翻译成中文,万试万灵,就是有点生硬,加上一点自己的理解相信没问题的。

收关

在一个运行库编译结束要记得去验证自己编译的库是否可用,能否支撑程序运行,这个技术难度不是很大,往往就是有很多依赖库不在本文件夹下,程序和动态库是分开的,最笨的办法是把它们复制到一起,这样的话,计算机就会多出很多冗余文件。据说还有一种办法是设置path参数,就是在导航到运新目录下,命令行中使用set path=%PATH%;bin_dir_for_use使用。点击打开链接

我构建完成的一套osg和osgearth环境。如果源文件缺失请自己下载解压一下。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="