算法移植建議流程
一、 系統環境
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, [email protected])
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