cmake编译OsgEarth2.10.1-VS2017-64版
前言
为了搭建这个osg加osgearth的开发环境,前前后后折腾了好久,中途用vcpkg自动编译了一个版本,但是实践证明osg没问题,但是osgearth有bug,应该是编译的依赖库的问题。所以只能自己手动编译,编译osgearth的前提是编译好osg和它的第三方依赖库。osg官网已经提供了各个版本的编译好的sdk,所以就省了这一个环节(osg本身的编译时间太长)。因为我要编译的是vs2017-64版本,所以我下载的osg-3.6.3-vs2017-x64这个版本还包含osgQt,debug和release都要下载。然后下载官方的第三方库,thirdparty-vs2017-64,里面有两个版本,下载Full package版本。为了后续编译的条理性,创建一个目录OSG,将osg的debug和release版本都解压到osg目录,将第三方库也解压到osg目录。然后在环境变量PATH里面添加osg的debug和release版本的bin目录,还有第三方库的bin目录。这是为了cmake在编译的时候可以自动检索到这些依赖库。
编译其他依赖
官网提供的第三方库包含了gdal等,但是osgearth还需要geos,protobuf,sqlite3,poco,rocksdb等。由于我刚开始初学,暂时用不到后面的扩展,这里我们只编译geos,sqlite3,poco,protobuf。这里统一使用cmake创建sln工程,这是为了更好的控制编译的参数。tool选择vs2017 x64(默认是选择win32,一定要修改)。
这里要注意cmake的时候,build目录(生成的vs工程和后续编译的二进制的目录)一定要和install(自动安装的目录)分开,不能选择同一个目录。这个install目录由CMAKE_INSTALL_PREFIX参数控制,默认在c:/Program Files(x86)
目录,一定要选在其他目录,不然安装的时候由于没有权限导致无法安装。
编译geos-3.7.2
这个过程没有什么曲折,cmake生成工程,vs编译安装即可。将安装完的bin,include,lib三个目录直接拷贝到第三方库的目录下即可,后续编译的依赖都需要拷贝到第三方库目录,方便统一设置环境变量。
cmake的时候注意是不是编译的dll版(shared),osgearth貌似需要dll版的依赖库。后续编译的protobuf就遇到这个问题,最开始编译的是静态版,导致编译osgearth出现大量错误,将它编译成动态版之后sogearth就完美编译成功了。同时编译的时候注意是否有参数区分了debug和release编译的库名称,一般用d来表示debug版。这个参数是CMAKE_DEBUG_POSTFIX,可能Cmakelist.txt并没有配置这个参数,那么就需要手动添加,但是有可能配置了其他参数来替代它,比如protobuf就是使用PROTOBUF_DEBUG_POSTFIX,这两者作用是一致的,这时候就不要再添加了。在cmake-gui的上方有一个按钮名称为Add Entry ,操作如下图所示:
编译poco
poco版本选择poco-1.9.0-all,记得选择all这个版本。其他和geos操作一致。
在用vs编译的时候,选择生成-批生成。然后勾选ALL_BUILD的debug和release版,点击生成即可,这样就会编译debug和release两个版本,编译完成之后同样选择生成-批生成,去掉ALL_BUILD的勾选项,将INTSALL的debug和release勾选,点击生成,这样就会将编译好的库和头文件都拷贝到camke设置的安装目录,操作如下图:
cmake编译OsgEarth2-10-1-VS2017-64版\IMG_0047](cmake编译OsgEarth2-10-1-VS2017-64版\IMG_0047.png)
编译sqlite3
其实这已经不是编译了,官网上已经提供了编译好的二进制,这个dll可以同时在debug和release两个环境使用。我下载的是sqlite-amalgamation-3280000和sqlite-dll-win64-x64-3280000。解压,将sqlite3.h和sqlit3ext.h拷贝到第三方库的include目录。然后将解压出来的dll转化为lib。操作如下,先打开vs2017的x64 Native cmd窗口,然后cd进入到dll存在的目录,里面包含两个文件,sqlite3.dll和sqlite3.def。调用如下命令即可,就会生成sqlite3.lib和sqlite3.exp。
编译protobuf
版本一定要选择3.8.0,这是osgearth的依赖要求,cmake的时候去掉protobuf-BUILD_TESTS的勾选,不然会报错,然后勾上protobuf_BUILD_SHARED_LIBS,编译动态版。然后在zlib的依赖文件在第三方库中已经有,选择即可。如下图所示:
protobuf默认是编译静态版,后续osgearth编译的时候需要动态版,导致编译失败。编译这个的同时也解决了我一个问题,由于我总是使用gcc编译动态库,动态版就是.so,静态版就是.a。但是msvc的很多库就是编译要链接.lib文件,运行的时候需要.dll支持,不然无法运行。我搞不懂这个库到底是静态版还是动态版,通过这次百度才知道,这其实是一个动态版的库,那个.lib里面只是导出的定义,实现还是在.dll里面。msvc编译的库可以分为四种:1、MT(多线程静态release版);2、MTd(多线程静态debug版);3、MD(多线程动态release版);4、MDd(多线程动态debug版)。这个可以在vs里面修改。右键工程–选择属性–c/c++–代码生成-运行库。
编译osgEarth
osgearth选用2.10.1版本,前面配置完环境变量之后,configure的时候大部分依赖都会自动找到。这里需要修改一下未能正确配置的地方。1、PROTOBUF_USE_DLLS勾选上;2、THIRD_PARTY_DIR目录选择第三方库目录。3;libcurl库的debug版未找到,手动去第三方库目录添加。再检查一下,有没有漏下的地方。将生成的osgearth库拷贝到OSG目录,环境变量PATH添加该库的bin目录。
下载数据
下载最新的osg数据,下载地址下载最新的3.4.0即可,解压到OSG目录。然后将该目录重命名为data,将osgearth源码里面的data和tests拷贝到OSG目录下,添加环境变量OSG_FILE_PATH,值为OSG/data目录。