算法移植建议流程
一、 系统环境
1、 安装系统
CentOS 5.5 (默认安装即可,无需更新,更新也可)
2、 安装编译环境(在登陆root账户下,进行程序安装;确保可以链接网络,大部分程序可以网上自动安装)
(1) 安装C++编译器(g++)
终端输入:yuminstall gcc gcc-c++
(2) 安装生成makefile文件的工具autotools
终端输入:yuminstall autoconf
终端输入:yuminstall automake
终端输入:yuminstall libtools
(3) 集成开发环境IDE采取系统自带文本编辑器gedit
相关插件(linux_tools_cjs/gedit)已整理好,gedit文件夹拷贝至/home/用户名/.gnome2下。
(.gnome2是隐藏文件夹,在/home/用户名/下Ctrl+H即可出现隐藏文件)
Gedit很强大,可熟悉使用。
二、 Windows下工作(以PCA为例)
1、 将Windows下的算法程序首先修改为windows下命令行调用的形式
命令行工程类型采取win32console Application-An application that support MFC 即可,在该工程中尽量少用MFC类,但可能不可避免,这些都可以在下一步进行消除。(PCA-M_Fusion-FusionPCA)
2、 统计该工程所涉及的动态库,将这些动态库与工程按照原文件夹格局建立一个简洁的、仅完成该算法的IRSAPCA。(完成统计整理工作后,大家讨论一下,有些底层动态库是公用的,可以分工合作完成,避免2个版本的可能)(PCA涉及gdal、FindSameRegionDll、fusionbaseonPCADll、ZoomDll、ZoomGeoDll、EIGEN、GJCPEG、tinyxml、GeneralFunction;这些库都按照原位置进行放置)
3、 整理完成该算法程序的单独大工程后,将该大工程,拷贝到linux下。进行下一步工作。
三、 Linux下工作(编译最好在普通用户权限下进行,即非root用户)
1、 在linux下,工程只需留下.h.cpp文件,其他删除。从库开始编译。以ZoomDll为例,在该文件下终端输入:g++ -Wall ZoomDll.cpp –L../../lib/gdal/-lgdal –ldl –o ZoomDll.a 该指令是用g++编译器,打开-Wall 编译警告功能,编译ZoomDll.cpp(不需要添加头文件),添加库文件搜索目录–L../../lib/gdal/,添加库-lgdal –ldl,生成名为ZoomDll.a的静态库。(其他指令参看An_Introduction_to_GCC_中文.pdf)
2、 所有库编译通过后,开始编译程序,指令与编译库类似,以FusionPCA为例,指令输入g++ -Wall FusionPCA.cpp -L../../lib/gdal/ -lgdal -L../../M_IP_IMAGECOMPUTE/FindSameRegionDll/-lFindSameRegionDll -L../fusionbaseonPCADll/ -lFusionbaseonPCADLL -L../../M_IP_GEOMETRYTRANS/ZoomGeoDll/-L../../M_IP_GEOMETRYTRANS/ZoomDll/ -lgdal -lZoomDll -lZoomGeoDll -L../../M_BASEFORALL/EIGEN/ -leigen -L../../M_BASEFORALL/GJCPEG/ -lgjcpeg -L../../M_BASEFORALL/tinyxml/ -ltinyxml -ldl -g -o FusionPCA
3、 在编译工程中较容易遇到的问题,替换相关类或数据类型(注意编译器严格检查大小写)
Windows | linux |
BOOL | bool |
CString | char *或string(#include<iostream> using namespace std):文件名用string代替,其他用char*,视情况而定 |
FALSE/TRUE | false/true |
DWORD | Unsigned long |
ZeroMemory(pBuf,dwBufBytes);
| memset(pBuf,0,dwBufBytes);
|
还有其他函数等应用问题,可先大家讨论,若已改写就可用,若未改写再进行改写。
已有投影复制、删除文件、获得后缀名判断数据类型、Xml读写、查询等函数。若有需要可直接复制。
四、 程序规范化实现。使用autotools建立makefile,实现程序或库的自动编译。(该工程可以与第三步同时进行)(以ZoomDll为例)(autotools详细介绍参考使用Automake,Autoconf生成Makefile+.doc)
1、建立一个Makefile.am文件,有如下内容
lib_LIBRARIES = libZoomDll.a 库名称
libZoomDll_a_SOURCES = ZoomDll.cpp 库cpp文件
libZoomDll_a_LIBADD =../../lib/gdal/libgdal.a 引用库
程序FusionPCA内容如下(可与上一步的命令行进行类比)
bin_PROGRAMS = FusionPCA
FusionPCA_SOURCES = FusionPCA.cpp
FusionPCA_LDADD = ../../lib/gdal/libgdal.a../../M_IP_IMAGECOMPUTE/FindSameRegionDll/libFindSameRegionDll.a../fusionbaseonPCADll/libFusionbaseonPCADLL.a../../M_IP_GEOMETRYTRANS/ZoomGeoDll/libZoomGeoDll.a../../M_IP_GEOMETRYTRANS/ZoomDll/libZoomDll.a../../M_BASEFORALL/EIGEN/libeigen.a ../../M_BASEFORALL/GJCPEG/libgjcpeg.a../../M_BASEFORALL/tinyxml/libtinyxml.a../../M_BASEFORALL/GeneralFunction/libgeneralfunction.a –ldl
2、在库文件夹下运行autoscan,生成文件configure.scan。将AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)替换为
AC_INIT(ZoomDll, 1.0, haojknm@126.com)
AM_INIT_AUTOMAKE
AC_PROG_RANLIB
然后,将configure.scan重命名为configure.ac
3、根据Makefile.am生成Makefile文件,输入以下命令
aclocal
autoheader
autoconf
automake --add-missing(若提示缺少文件,再输入touch NEWS AUTHORSChangLog)
4、 程序编译通过后,输入
./configure
./FusionPCAcjs.xml out.xml