公司自己的项目,打算用最新的2.10osgearth,所以折腾一波。。。。。。
前期各种库可直接编译两种,完了osg 直接编译debug release省时间
编译前的准备:
- widow7
- cmake-3.15.4
- vs2015
- osg3.6.4
- osg-3rdparty(第三方依赖库)
- osgearth2.10
- gdal3.0.1
- proj6.2.0
- sqlite3.30
- geos3.7.2
- OsgQt
第一步 编译gdal3.0.1+proj6.2.0+geos3.7.2+sqlite3.30**
1. 静态编译SQLite库。
因为gdal3.0.1版本必须依赖geos库和sqlite,所以首先得把sqlite库编译完成。到官网下载源码sqlite-amalgamation-3300100.zip和windows运行时的预编译二进制文件sqlite-dll-win64-x64-3300100.zip
创建新的静态库工程,把上面下载的文件解压加入到新空项目:
(1)将sqlite3.c、sqlite3.h、sqlite3ext.h、sqlite3.def四个文件添加到工程中,目录结构如下:
(2)预处理设置:C/C++ --> 预处理器 --> 预处理器定义:设置预定义处理
_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY
(3)设置模块定义文件,链接器 --> 输入 --> 模块定义文件:sqlite3.def
(4)修改模块定义文件:在最后追加sqlite3_unlock_notify![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f29087432d0cbebabec43c16cdb0ce89.png)
(5)配置类型改为静态库lib
(6)最后生成解决方案(需要生成debug版时,选择debug,这里以release版为例)
x64\Release文件夹可以看到SQLite3.lib静态库和SQLite3.exe。在SQLite目录中分别创建include和lib和bin文件夹,将刚才生成的.lib文件放入lib文件夹中,将sqlite3.h、sqlite3ext.h放入include中,将sqlite-tools-win32-x86-3280000.zip中的sqlite3.exe放在bin文件夹中以备后用。
2.编译proj
(1)解压文件,放到以下目录中C:\Users\Administrator\Desktop\mypro\proj-6.2.0
(2)打开cmake进入到源码目录:
(3)点击Configure,编译64位,vs2015.然后配置好以下路径:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/97b3cfca4552c3487d9d74e1ecabf129.png)
cmake_install_prefix路径是生成后的库文件都会放在此目录下。然后再次点击configure,无错误后点击generate,也无错误后点击open project,就会打开工程文件,选择需要编译的版本进行编译(debug或release),编译完成后再编译INSTALL就会在刚刚上面配置的cmake_install_prefix的路径下找到库文件了。
3.编译GEOS
Geos目前新的版本是3.7.2,使用VS进行编译(这个如果是编译osgearth2.8的话要使用geos3.5.0,要不然不同版本会出现问题)。
环境VS2015+CMake3.15.6
cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64 (vcvars64的目录)
vcvars64
cd 到geos目录下
autogen.bat
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
DEBUG版本
cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64 (vcvars64的目录)
vcvars64
cd 到geos目录下
autogen.bat
nmake /f makefile.vc DEBUG=1
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
geos 3.5.0
修改配置文件nake.opt
这个配置是debug 还是release不修改就会出现debug用release的lib编译后续出现问题
x64 ,64位还是32位自己发挥
根据自己编译器的版本号添加,下边是我的
4.编译GDAL
gdal3.0.1
(1)把压缩包解压到
E:\mypro
(2)进入文件夹找到nmake.opt文件,打开。
第41行左右,找到MSVC_VER=设置为1900(VS2015版本应该为1900及以上,视自己编译器而定)。
第57行左右找到GDAL_HOME =将生成文件的路径设置成你想要的位置。
第194行左右找到WIN64=YES,如果生成64位版本取消注释本行。
第218行左右找到DLLBUILD=设置为1启动动态编译、 0为静态编译。这里一定一定要是动态编译!因为osg依赖于动态生成的gdal_i.lib,静态编译生成的好像没有带i结尾的库,这也是我最后编完之后但是无法使用osg或osgearth调用gdal的原因,因为一开始我编译的是静态的。
第238行左右,找到PROJ_INCLUDE PROJ_LIBRARY,分别设置成你刚才生成PROJ时的include和lib文件夹(其中PROJ_INCLUDE的-I后为地址),并将.lib的名称改对。
第613行左右,找到GEOS_DIR,分别设置成你刚才生成GEOS时的include和lib文件夹,并将.lib的名称改对。
第509行左右,找到SQLITE_INC SQLITE_LIB,路径设置同上。至此设置完成,保存文件。
(3)执行release编译,打开
vs x64 命令行
进入到源码文件夹,输入以下命令进行release版本编译,如果要进行debug版本就在下面命令makefile.vc后面加上DEBUG=1。
(如:nmake /f makefile.vc DEBUG=1)
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
遇到的问题
win7 VS2015编译GDAL 正在创建库 gdal_i.lib 和对象 gdal_i.exp时候报错:LINK : error LNK2001: 无法解析的外部符号 _OSRValidate
5. 编译osg
(1)数据准备
OpenSceneGraph-3.6.4,OSG的源码包。
osg-3rdparty-cmake-master.zip,源码包依赖的第三方库。
OpenSceneGraph-Data-3.4.0.zip,自带的一些数据资源文件。
(2)osg-3rdparty(第三方依赖库)
蛋碎一地,只有2015没有预建包。。。自己cmake了只能。。。。
下载
在VS2015下官方并没有提供编译好的包,只能自己编译,这一步如果有已经编译好的第三方库则可以跳过。建议没库编译经验的同学用其他VS版本跳过这一步,或者找已经编译好的版本(本文最后提供已经编译好的版本)。
解压下载好的第三方库包osg-3rdparty-cmake-master,就会发现里面有个download_dependencies.bat,用记事本打开:
也就是说第三方库源代码需要通过这个批处理文件来获取,最后会下载到C:\3rdparty这个文件夹(不想下载可以从本文最后处地址获取)。里面有三个cmd不识别的命令:git、curl以及7z。
Git:
可以参考《Git安装教程(windows)》来安装git;
CURL:
下载curl
下载后设置curl.exe所在目录的环境变量
然后cmd中测试
curl --help
7z:
可以安装7-Zip
下载后设置curl.exe所在目录的环境变量
然后cmd中测试
都安装好以后,将download_dependencies.bat加载cmd里面运行,等待下载完成就可以了,注意在cmd里面检查批处理命令的输出结果。
下载完成以后,打开cmake,填入source目录以及build目录,点击configure,选择VS2015-64位编译器,configure完成后,按照如下配置进行再次configure,直到没有红色高亮显示
点击Generate生成VS工程,用VS2015打开,生成解决方案,等待编译完成就可以了。编译完成后单独生成INSTALL工程,编译结果就会自动安装到CMAKE_INSTALL_PREFIX设置的文件夹。
(3) CURL 编译
编译之前要编译好zlib 和openssl
CURL下载
使用vs2015命令行
debug
nmake /f Makefile.vc mode=dll vc=12 MACHINE=x64 WITH_SSL=dll DEBUG=yes WITH_ZLIB=dll SSL_PATH=E:\OpenSSL-Win64 ZLIB_PATH=E:\mypro\release\3rdParty
release
nmake /f Makefile.vc mode=dll vc=12 MACHINE=x64 WITH_SSL=dll DEBUG=no WITH_ZLIB=dll SSL_PATH=E:\OpenSSL-Win64 ZLIB_PATH=E:\mypro\release\3rdParty
中途可能确实openssl的相关依赖,可以选择编译或者使用编译好的包
(4) OSG 3.6.4
解压源码包,文件夹重命名为OpenSceneGraph-3.6.3。启动cmake,填入源代码路径和编译路径,点击Configure,界面就会出现一些编译选项。
全部像上面配置完(gdal库一定要像白线那样配置为gdal_i.lib)之后再次点击configure,无错,点击generate,最后open project之后像编译proj4那样build和install完之后就可以在刚刚配置的路径找到库文件。
全部像上面配置完(gdal库一定要像白线那样配置为gdal_i.lib)之后再次点击configure,无错,点击generate,最后open project之后像编译proj4那样build和install完之后就可以在刚刚配置的路径找到库文件。
生成目录下的bin,还有Lib文件,我生成的时候找不到osgPlugins-3.4.1这个lib文件夹,如果没有找一下吧
6. OSGEarth 2.10
基本跟OSG差不多,解压然后用Cmake进行编译
设置相关路径,2.10去掉了osgEarthQt模块所以要重新编译。
这里GEOS我是编译路径设置错了,所以后续修正了,白色的
osgEarthSilverLining、osgEarthTriton编译
这个提前下载sundog官网的sdk安装选择路径即可
osgEarthQt编译
2.10删除了osgEarthQt模块因此要自己编译
osgearth/src/osgEarthQt/CMakeList.txt 需要对照旧版本的更改(我是直接暴力粘贴过去)
https://github.com/gwaldron/osgearth/blob/2.8/src/osgEarthQt/CMakeLists.txt
osgearth/src/CMakeList.txt需要对照旧版本的更改(这个就是增加osgEarthQt的lib)
https://github.com/gwaldron/osgearth/blob/2.8/src/CMakeLists.txt
CMakeModules文件夹文件FindOsgEarth.cmake 文件增加下面的配置
FIND_OSG_LIBRARY( OSGQT_LIBRARY osgQt )
FIND_OSG_LIBRARY( OSGQT_LIBRARY_DEBUG osgQtd )
然后勾选项目选项
打开文件进行正常编译即可,缺失的自动补全
7. OSGQt
osg3.6以后去除了osgqt,所以要分开编译,如果3.6以下不含3.6则使用我下班的方法添加osgqt的编译
使用工具:qt cmake当然要准备好
下载源码
前提osg3.6已经编译完成,使用cmake之前要修改一下Cmakelist.txt的
新加
SET(DESIRED_QT_VERSION "5.8.0" CACHE STRING "")
SET(CMAKE_PREFIX_PATH "E:\\Qt\\Qt5.8.0\\5.8\\msvc2015_64" CACHE PATH "")
然后开config
设置好以后generate openproject 然后就是vs2015编译了
ALL_BUILD INSTALL 完成
8. OSGOcean
OSGOcean是基于osg开发用来做水效果的
下载地址
(1)准备快速傅里叶变化算法库
我选择FFTW[下载地址]http://www.fftw.org/install/windows.html)
解压之后,启动vs命令行,并切换到解压目录:
然后运行以下三个命令
lib /def:libfftw3-3.def
lib /def:libfftw3f-3.def
lib /def:libfftw3l-3.def
然后会在目录中生成.h文件.lib文件,这也是编译时要连接的文件;
(2)编译osgOcean
首先采用上面用cmake生成osg工程的步骤产生osgOcean工程:
osg链接就不用说了,设置好就行了
我选择的是FFTW3勾上
正常configure
generate open project
vs2015打开以后正常ALL_BUILD
设置oceanExample为启动项目
把oceanExample设置为启动工程,把工作路径设置为exe所在目录:
启动的时候没有找到Lib dll 自己设置一下就完了
启动可看到效果
遇到的问题:
1.普通的lnk2019的问题就不说了,一般都是include库设置不对。。。能编译的都是有点基础的,直接排插就完了
2.nvcore/nvcore.h: No such file or directory,memory.h错误找不到nvcore/nvcore.h
这个需要重新编译nvtt:下载nvtt
然后cmake编译一下,方法同上不需解释了
可以直接在 E:\mypro\nvidia-texture-tools\project\vc12 目录下找到对应的vs版本,启动后生成解决方案
然后在指定的文件夹可以找到对应的文件
3.OSG3.40 编译时,无法打开输入文件“optimized.lib”
解决方案:
正常情况下,下图中会多出一项:ZLIB_LIBRARY_RELEASE,之后屡次编译,都提示“无法打开输入文件“optimized.lib””
因为ZLIB_LIBRARY就相当于是ZLIB_LIBRARY_RELEASE,而配置过ZLIB_LIBRARY_RELEASE后会忽略ZLIB_LIBRARY,
实际上,起作用的是ZLIB_LIBRARY,所以会发生错误“无法打开输入文件“optimized.lib””
测试方法:
创建一个vs项目,指定osg的include lib 目录,还有工作目录
附加依赖项:
OpenThreadsd.lib
osgViewerd.lib
opengl32.lib
glu32.lib
osgd.lib
osgDBd.lib
osgFXd.lib
osgGAd.lib
osgManipulatord.lib
osgParticled.lib
osgShadowd.lib
osgSimd.lib
osgTerraind.lib
osgTextd.lib
osgUtild.lib
osgWidgetd.lib
//main.cpp
#include <iostream>
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
using namespace std;
int main()
{
//这里修改成OSG数据包里面的实例数据
string osgPath = "D:\\Work\\OSGBuild\\OpenSceneGraph-Data\\cow.osg";
osgViewer::Viewer viewer;
osg::Node * node = new osg::Node;
node = osgDB::readNodeFile(osgPath);
viewer.setSceneData(node);
return viewer.run();
}
编译启动:
本文参考:https://blog.csdn.net/After_April/article/details/102520644
https://blog.csdn.net/charlee44/article/details/86761461#2_10
https://blog.csdn.net/LISA_SMITH/article/details/94739101