基于osg3.2.1 + osgearth2.6 国产银河麒麟三维系统移植

  • Post author:
  • Post category:其他


去年还是前年编的不记得了 ,现在记录一下。


1. 通常编译步骤,

进入源码根目录、在源码根目录中打开终端并依次执行下面三个命令:

./configure

make

make install


2.如果源码根目录没有configure文件但是有CmakeLists.txt文件

,那就用cmake,依次在终端中执行:

cmake .

make

make install


3.在执行make install命令时需要root权限。

执行su命令,例如:

su

然后输入密码,但是在第一次切换到root用户时即使密码正确也会报错

su:鉴定故障

将密码重置一下即可,执行:

sudopasswd root


4.编译默认类型是Release,

位数为操作系统的位数,如果需要调试信息在configure的时候加上

–enable-debug

参数,例如:


./configure –enable-debug



如果是用


cmake


就打开


CmakeLists.txt


文件,在文件中加一行:

set(CMAKE_BUILD_TYPE “Debug”)


5.在

configure


的时候可能遇到

错误:

configure:error: cannot guess build type; you must specify one

遇到这个错误就是说它不知道当前机器类型、要自己指定系统类型,麒麟的是arm-linux所以在configure的时候加上参数 –build=arm-linux 。例如:


./configure

–build=arm-linux


6.configure指定编译路径加参数

–prefix=/home/…(你指定的路径) ,如果不指定默认就在/usr/local目录下,这个目录有个好处就是不用配置环境变量,但是不好的时如果编译很多库的话会很混乱。例如:


./configure

–prefix=/home/geotest/


7.第三方依赖库

包括:

zip-1.2.11

jpeg-8a

png-1.0.67

tiff-4.0.8

gif-5.1.4

minizip

freetype-2.4.2

sqlite-autoconf-3200000

curl-7.54.1

sdl-1.2.15

proj-4.9.3

geos3.4.2

protobuff-2.5.0

openssl-1.02l

gdal-1.7.3

Qt4.8.6


按照一下顺序依次编译,注意

gdal-1.7.3

要最后编。

zip-1.2.11、jpeg-8a、png-1.0.67、tiff-4.0.8、gif-5.1.4、minizip、openssl-1.02l、proj-4.9.3、geos3.4.2、freetype-2.4.2、sqlite-autoconf-3200000、curl-7.54.1、sdl-1.2.15、protobuff-2.5.0、、gdal-1.7.3、Qt4.8.6


编译问题说明:

如果在configure的时候使用了参数–prefix指定目录就要配环境变量

打开/home/geotest(你的用户名)/.bashrc文件,在文件末尾加上例如:

export PATH=$PATH:/home/geotest/builder /3rdparty/gdal-2.1.2/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/geotest/builder/3rdparty/gdal-2.1.2/lib

配置环境变量都像这样,以下不在重复。


编译protobuf-2.5.0

报错In file included from./google/protobuf/stubs/atomicops.h:59:0,

fromgoogle/protobuf/stubs/atomicops_internals_x86_gcc.cc:36:

./google/protobuf/stubs/platform_macros.h:61:2:

error: #error Host architecture was notdetected as supported by protobuf

原因是protobuf2.5.0对arm64不支持,没有相应的宏控制,如果只是单纯的添加一个宏会报错: undefined reference to`google::protobuf::internal::Acquire_CompareAndSwap(long volatile*, long, long)

下了个最新版遍过了,打开源码对比,就是原子相关操作的代码宏控制有点问题。

解决方法如下:

将最新版的文件:/protobuf-3.4.0/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h拷到/protobuf-2.5.0/src/google/protobuf/stubs这个目录下

打开/protobuf-2.5.0/src/google/protobuf/stubs/platform_macros.h,在其中添加这几句分支:

#elif defined(__aarch64__)

#define GOOGLE_PROTOBUF_ARCH_AARCH64 1

#define GOOGLE_PROTOBUF_ARCH_64_BIT 1

打开/protobuf-2.5.0/src/google/protobuf/stubs/atomicops.h文件

在其中添加分支:

#elif defined(GOOGLE_PROTOBUF_ARCH_AARCH64)

#include<google/protobuf/stubs/atomicops_internals_arm64_gcc.h>

重新make搞定


编译gdal-1.7.3

报错expected identifier or ‘(‘ before’__extension__’ char* strndup(const char* str, size_t n);

打开gdal-1.7.3/ogr/ogrsf_frmts/geojson/jsonc/config.h在文件头部添加宏

#define _GNU_SOURCE


编译qt4.8.5

,编不过

make报错:../3rdparty/javascriptcore/JavaScriptCore/runtime/JSValue.h:In constructor error: cast from ‘QTJSC::JSCell*’ to ‘int32_t {akaint}’ losesprecision

尝试修改源码,修改好了,编译通过,很好,运行提示:段错误

换了一个Qt版本,编译Qt4.8.6一路通过。




编译qtcreateor-3.2.2

进入源码根目录执行:

qmake -r

make

报错../3rdparty/botan/botan.cpp:46205:21: fatal error: cpuid.h: 没有那个文件或目录

百度看到这个帖子http://blog.csdn.net/deyili/article/details/49868987

解决方法不让Qt遍这个第三方库,自己指定botan,一般系统自带,打开这个文件:

qt-creator-opensource-src-3.2.2/src/libs/3rdparty/botan/botan.pri

修改如下(注意是用以下内容将此文件完全覆盖):

INCLUDEPATH *= $$PWD/..

HEADERS += $$PWD/botan.h

DEFINES += USE_SYSTEM_BOTAN

#CONFIG += link_pkgconfig

#PKGCONFIG += botan-1.10

INCLUDEPATH += $$/home/geotest/builder/Botan-1.10.16/build/include

LIBS += /usr/lib/libbotan-1.10.so.1

(系统没有botan头文件,自己下的源码也编不过。系统刚好有自带的botan库 系统自带的库和下的头文件组合)

之后继续make成功


编译osg3.2..1

执行cmake . 提示差什么就在环境变量补什么,还有个问题是配了环境变量还是找不到就在CMakeLists.txt里补,例如:

set(CMAKE_INCLUDE_PATH    “/home/geotest/builder/osg/3rdparty/libxml2-2.7.6/include””/home/geotest/builder/osg/3rdparty/SDL-1.2.15/include/SDL””/home/geotest/builder/osg/3rdparty/tiff-4.0.8/include”)

set(CMAKE_LIBRARY_PATH    “/home/geotest/builder/osg/3rdparty/libxml2-2.7.6/lib””/home/geotest/builder/osg/3rdparty/SDL-1.2.15/lib”/home/geotest/builder/osg/3rdparty/tiff-4.0.8/lib)

set(QT_QTOPENGL_INCLUDE_DIR “/home/geotest/builder/qt-everywhere-opensource-src-4.8.6/include/QtOpenGL”)

set(QT_QTOPENGL_LIBRARY_RELEASE “/home/geotest/builder/qt-everywhere-opensource-src-4.8.6/lib”)

这里提一下,我遇到一个坑就是我系统里本来就有qt4和qt5导致cmake的时候说找不到Qt5OPenGL什么的花了很长时间想把那两个自带的库清干净无果,最后直接在

CMakeLists.txt里强制指定Qt的版本cmake-DDESIRED_QT_VERSION=4指定版本

然后打开这个文件强制指定我们编译的Qt路径

/usr/share/qtchooser/qt4-aarch64-linux-gnu.conf

修改如下:

/home/geotest/builder/qt-everywhere-opensource-src-4.8.6/bin

/home/geotest/builder/qt-everywhere-opensource-src-4.8.6

之后cmake . make make install一路成功


编译osgearth2.6

在configure的时候会报错说没找到Qt5的一些库,同样是因为本机自带Qt5和Qt4造成的。

打开CmakeList.txt将对Qt5版本分支控制出注掉就好了。



编译到qt相关的模块合和例子都会报错:undefined reference to XInitThreads

//usr/lib/aarch64-linux-gnu/libX11.so.6: error adding symbols: DSOmissing from command line.

打开对应模块的CmakeList.txt文件找到TARGET_ADDED_LIBRARIES,并在其中添加

/usr/lib/aarch64-linux-gnu/libX11.so如下:

SET(TARGET_ADDED_LIBRARIES

osgEarthQt

${QT_QTCORE_LIBRARY}

${QT_QTGUI_LIBRARY}

${QT_QTOPENGL_LIBRARY}

/usr/lib/aarch64-linux-gnu/libX11.so

)

继续make一路通过


系统功能移植

在解析模型的时候,模型数据混乱,原因是在64位linux下long是8个字节,但是在64位windows下为4个字节,造成数据偏移错位,将long换成int后问题解决。


1.影像不能加载,

osg报错:Warning: Error in reading to”image.jpg”,最后调试源码发现在读jpeg文件的时候,链接到gdal库里面去了,问题是编译顺序不对,gdal自带有jpeg库,如果他们找到系统的jpeg库就会将自带的静态的编进去,然后gdal自带的版本和osg插件链接的版本不一致就报错了,所以将之前的gdal库卸载,先编译jpeg,然后编gdal就可以了


2.地形不能加载

,调试源码报错can’t find linker symbol for virtual table for `osgEarth::GeoHeightField’ value,以为自己代码问题,最后发现是gdb有问题,最终地形看不到是因为hasdata判断有问题 最后返回值是以前遗留问题,window下没问题,linux就暴露出来了,教训是要好好看看编译器报的警告。


3.shp矢量无法读取报错

ERROR 1: SQL Expression Parsing Error: syntax error, unexpected endof string, expecting ‘.’. Occurred around :

SELECT * FROM ‘A1行政办公用地’

版本问题,新版本的gdal貌似不支持表名加引号,

编译gdal-1.7.3

报错expected identifier or ‘(‘ before’__extension__’ char* strndup(const char* str, size_t n);

打开gdal-1.7.3/ogr/ogrsf_frmts/geojson/jsonc/config.h在文件头部添加宏#define _GNU_SOURCE

编译通过



版权声明:本文为lawest原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。