去年还是前年编的不记得了 ,现在记录一下。
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
编译通过