1、通过 Subversion 下载 Opticks 源代码
Opticks 开发采用 Apache Subversion 版本管理工具,这里使用 TortoiseSVN 1.8 下载 Opticks 源代码。
(1)下载并安装 Subversion 客户端 TortoiseSVN 1.8 (http://tortoisesvn.net/downloads.html)。
例如:安装路径为 C:\ProgramFiles\TortoiseSVN\bin。
说明:安装完成后,将自动在系统环境变量 PATH 中添加 C:\Program Files\TortoiseSVN\bin,以便识别 svn 命令。
(2)在路径 C:\ProgramFiles\TortoiseSVN\bin 中新建批命令文件,例如:opticks_download.bat,输入以下内容并保存:
-------------------------------------------------------------------------------------------------------
svn checkouthttps://svn.code.sf.net/p/opticks/code/releases/4.11.0/trunk/c:\opticks-source411
-------------------------------------------------------------------------------------------------------
其中:
l svn : 表示 Subversion 客户端命令
l checkout : 表示下载操作
l https://svn.code.sf.net/p/opticks/code/releases/4.11.0/trunk/: 表示 Opticks4.11.0 源码的网络位置
l c:\opticks-source411 : 表示保存到本地位置
-------------------------------------------------------------------------------------------------------
(3)运行 opticks_download.bat,自动下载 Opticks 源代码。
说明:下载的 Opticks 源码仅包括 Opticks 自身的源码,不包含依赖库的源码。
2、通过Apache Ivy下载 Opticks 依赖库
Opticks 采用了 Apache Ivy 依赖库管理工具,Ivy 需要 JRE 运行环境。
(1)下载并安装 JRE8,地址 (http://www.oracle.com/technetwork/java/javase/downloads/index.html)。
(2)Apache Ivy 位于 c:\opticks-source411\Dependencies 内,不需单独下载;运行 C:\opticks-source411\Dependencies\retrieve-dependencies.bat,将自动下载依赖库,依赖库保存到 C:\opticks-source411\Dependencies\ 目录下。
3、通过VS2010编译 Opticks
Opticks4.11 采用 VS2010进行编译,编译中需要调用 Python 命令,这里采用 ActivePython 2.7。
(1)下载并安装 ActivePython 2.7 (http://www.activestate.com/activepython/downloads)。
例如:安装路径为C:\Python27\。
说明:安装完成后,将自动在系统环境变量 PATH 中添加 C:\Python27\;C:\Python27\Scripts,以便识别 Python 命令。
(2)定义依赖库目录环境变量 OPTICKSDEPENDENCIES,例如值为 C:\opticks-source411\Dependencies。
注意1:由于 update-build-revision.py 执行时调用 svnversion 命令,编译之前必须安装Subversion 客户端。
注意2:Opticks 采用了 Python2.x 语法,Python 3.x 语法有些大的变化,采用 Python 3.x 解析 update-build-revision.py 时会有问题。
(3)打开C:\opticks-source411\Code\application\Opticks.sln文件,直接编译
说明:Opticks还提供了一系列编译配置文件,位于C:\opticks-source411\Code\application\CompileSettings\目录中。
(4)出现warning C4819警告时,使用UltraEdit将文件从UTF-8无BOM格式转换为UTF-8有DOM格式。
4、编译环境安装错误
(1)在 Win7 下运行 Slik Subversion 1.8 (http://www.sliksvn.com/en/download) 安装程序时,出现 “Installation directory must be on a localdrive” 错误。
分析原因:Slik Subversion1.8 安装程序存在问题,不支持 Win7。
解决方法:改为同类软件 TortoiseSVN。
(2)在 Win7 下运行 Python 2.7 (http://www.python.org/) 安装程序时,出现 “There is a problem with this WindowsInstaller package. A DLL required for this install to complete could not be run.Contact your support personnel or package vendor.”。
分析原因:Python 2.7 安装程序存在问题,不支持 Win7。
解决方法:改为同类软件 ActivePython2.7。
5、编译错误
5.1编译错误:error MSB3073:命令python.exe"……\..\update-build-revision.py”VCEnd已退出,代码为 1
分析原因:未安装Subversion客户端工具引起。
解决方法:安装TortoiseSVN。
5.2编译错误:File"...\update-build-revision.py",line 35
print "NewBuild Revision #is", version_number
SyntaxError:invalid syntax
分析原因:Opticks采用了Python 2.x语法,不同于Python 3.x语法,导致print命令无法编译通过。
解决方法有两种:
(1)推荐:卸载Python 3.x,安装Python 2.x,若同时安装了两种版本,将使用Windows中.py文件关联的版本。
(2)修改update-build-revision.py等相关Python文件的语法,改动地方较多,不推荐。
说明:通过Python 3.x提供的2to3.py工具,可以将Python 2.x语法格式转换为Python3.x语法格式,但是只能转换简单的语法差异,不能转换复杂的语法差异。在cmd下直接运行的例子:
-------------------------------------------------------------------------------------------------------
pythonC:\Python33\Tools\Scripts\2to3.py-w update-build-revision.py
-------------------------------------------------------------------------------------------------------
其中:
l python需要在系统环境变量Path中保存C:\Python33\路径,以保证python.exe可以执行。
l C:\Python33\Tools\Scripts\2to3.py表示2to3工具
l -w表示备份源文件(添加后缀.bak),并创建与源文件同名的3.x格式文件。
l update-build-revision.py表示2.x格式文件
-------------------------------------------------------------------------------------------------------
5.3编译错误:fatal error C1083:无法打开包括文件:“BuildRevision.h”: No such fileordirectory
错误原因:update-build-revision.py编译失败,将导致该错误。
解决方法:
(1)推荐:编译通过update-build-revision.py
(2)注释掉它,然后#define BuildVision “tt”(随意写个吧)
5.4编译错误:Moc'ing *.h...系统找不到指定的路径
分析原因:moc.exe路径未正确设置。错误原因查找方法:
(1)打开*.h文件的属性,通过自定义工具 -> 命令行可以查看设置的路径,发现QTBIN宏解析的路径错误。
(2)查找发现QTBIN宏定义在C:\opticks-source411\Code\application\CompileSettings\Macros.props文件中,该文件未定义OPTICKSDEPENDENCIES宏。
解决方法有三种:
(1)推荐在”我的电脑“增加一个环境变量OPTICKSDEPENDENCIES,值为依赖库目录C:\opticks-source411\Dependencies
该变量将被build.py调用,若未设置,产生编译错误:Script Exception: Dependencies argument mustbe provided。
(2)修改C:\opticks-source411\Code\application\CompileSettings\Macros.props文件,在UserMacros属性组中添加以下内容:
<OPTICKSDEPENDENCIES>$(SolutionDir)..\..\Dependencies</OPTICKSDEPENDENCIES>
这种方法的好处是宏定义不依赖于特定路径,可以将源代码拷贝到任意路径下进行编译。
注意:QTBIN宏定义中,引用其它宏的前后顺序关系,若前后顺序关系颠倒了,则QTBIN宏的解析值可能为空或错误。
(3)在VS2010中添加OPTICKSDEPENDENCIES宏,值为依赖库目录C:\opticks-source411\Dependencies,设置步骤:
a)选择VS2010菜单视图(View) ->属性管理器(Property Manager)
b)在属性管理器中,展开目录树Opticks -> Debug | Win32->Microsoft.Cpp.Win32.user,点击右键打开属性对话框
c)在Microsoft.Cpp.Win32.user属性页中,选择通用属性 -> 用户宏,添加宏,名称为:OPTICKSDEPENDENCIES,值为:C:\opticks-source411\Dependencies
d)在属性管理器中,展开目录树Opticks -> Debug | x64->Microsoft.Cpp.x64.user,点击右键打开属性对话框
e)在Microsoft.Cpp.x64.user属性页中,选择通用属性 -> 用户宏,添加宏,名称为:OPTICKSDEPENDENCIES,值为:C:\opticks-source411\Dependencies
说明:moc全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt程序在交由标准编译器编译之前,先要使用 moc分析 C++ 源文件。如果它发现在一个头文件中包含了宏Q_OBJECT,则会生成另外一个 C++源文件。这个源文件中包含了 Q_OBJECT宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_构成。
5.5编译错误:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
分析原因:UNIX平台的UTF-8格式源代码文件包含非ASCII字符时,VS2010默认使用Gb2312格式解码导致。有时是换行符或空白符导致。
注意:这个警告最好不要禁止,因为出现这个警告的文件,就会无法设置断点
解决方法有两种:
(1)推荐:UltraEdit将UTF-8无BOM格式文件转换为UTF-8有DOM格式文件。
(2)不推荐在VS2010中直接保存,缺点是导致UTF-8格式文件中的非ASCII字符不能正确处理。
(3)在Project ->Properties -> ConfigurationProperties -> C/C++ -> Advance的DisableSpecificWarnings中添加相应的警告编号:4819
(4)在出现警告文件的开始处加入语句: #pragmawarning (disable:4819)
说明:使用VS2010创建源代码文件时,若需要使用中文字符,推荐保存为UTF-8格式,可以跨平台编译运行。具体保存方法为:选择cpp或h的全部内容,菜单文件(File) -> 高级保存选项(advanced save options),选择编码方式为Unicode -codepage 1200,保存源代码文件。
若换行符或空白符导致警告C4819,解决方法:打开出现警告错误的文件,按Ctrl+A全选代码,选择菜单的 “编辑→高级→设定选定内容的格式”,然后保存;再用VS2010的查找替换功能,打开允许正则表达式选项,选择当前窗口,查找替换 \n 为 \n 。查找的\n 是跨平台的回车,替换的 \n却是当前代码页的回车了。
5.6编译错误:error C2001:常量中有换行符
分析原因:UNIX平台的UTF-8格式源代码文件包含非ASCII字符时,VS2010默认使用Gb2312格式解码导致
解决方法有两种:
(1)推荐:UltraEdit将UTF-8无BOM格式文件转换为UTF-8有DOM格式文件。
(2)不推荐采用手工方式删除引起错误的非ASCII字符,将导致字符信息丢失。
(3)在AppVersion.h源文件中有版权字符,虽然AppVersion.h保存为UTF-8有BOM格式文件,但是其它源代码文件(UTF-8有BOM格式)调用AppVersion.h中版权字符宏定义时,依然会出现错误,因此建议宏定义中不要使用非ASCII字符。以下是手工修改的例子:
AppVersion.h源文件第15和19行修改为:
#define APP_COPYRIGHT"Copyright (c) 2008, Ball Aerospace &Technologies Corp."
#define APP_COPYRIGHT_MSG"(c) 2000 - 2008 Ball Aerospace &Technologies Corp., Fairborn,Ohio"
AppConfig.h源文件第45和46行修改为:
#define MICRONstd::string("u")
#define DEG_CHARstd::string("*")
手工修改内容的文件包括:
PlugInUtilities\AppVersion.h修改版权字符
Batch\Main.cpp 修改版权字符
手工转换格式的文件包括:
Interfaces\AppConfig.h
Interfaces\TypesFile.h
Gui\PropertiesWavelengths.cpp
PlugInUtilities\Interfaces\GeoPoint.h
PlugInUtilities\GeoPoint.cpp
PlugInUtilities\StringUtilities.cpp
PlugIns\src\Aspam\AspamViewerDialog.cpp
PlugIns\src\DataFusion\Matrix.h
PlugIns\src\ENVI\EnviLibraryExporter.cpp
PlugIns\src\WizardItems\ZoomAndPanToPoint.cpp
32\include\opencollada\COLLADAFWGeometry.h
32\include\opencollada\COLLADAFWMesh.h
说明:Github保存了Opticks源码副本,通过https://github.com/tclarke/opticks可以下载源码。
说明:ApacheSubversion (http://subversion.apache.org/)网站可以下载Subversion源码,没有未提供可执行文件。
(4)Opticks源代码使用了UTF-8编码,由于Windows平台和UNIX平台在处理UTF-8编码文件时有差异,若源代码文件包括了非ASCII字符,在中文Windows平台上编译将出现异常错误,解决方法是使用UltraEdit将UTF-8无BOM格式文件转换为UTF-8有DOM格式文件。
具体操作:通过UltraEdit菜单"文件" ->"打开" 对话框,在打开方式中选择UTF-8,可以正常打开UTF-8无BOM格式文件,并另存为有BOM格式文件。
注意:UltraEdit通过文件关联的方式,打开UTF-8无BOM格式文件时存在问题。
关于UTF-8格式说明
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节;根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序的问题,也因此它实际上并不需要BOM (Byte OrderMark)。
BOM(Byte OrderMark)是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。
在UNIX平台上,UTF-8格式源代码文件不要BOM签名;在中文Windows平台上,UTF-8格式源代码文件需要BOM签名,否则使用默认GB2312格式进行解码。
Unicode (UTF-8带签名) - 代码页65001
简体中文(GB2312) -代码页936,也记为CP936
UTF-8无BOM格式转为UTF-8有BOM格式的工具:
(1)UltraEdit通过菜单文件 -> 打开对话框,在打开方式中选择UTF-8,可以正常打开UTF-8无BOM格式文件,另存为有BOM格式文件。
(2)GNU Emacs打开UTF-8无BOM格式文件时存在问题,可能需要一些设置。我选择Emacs 24.3 (http://ftp.gnu.org/gnu/emacs/windows/),下载Emacs之后,解压,直接运行bin\runemacs.exe即可,运行addpm.exe可以在系统开始菜单中添加Gnu Emacs快捷方式。
(3)Notepad++打开UTF-8无BOM格式文件时存在问题。
(4)Windows记事本打开UTF-8无BOM格式文件时存在问题。
(5)VS2010编辑器打开UTF-8无BOM格式文件时存在问题。
参考资料:
遥感平台opticks编译总结:http://blog.csdn.net/kupepoem/article/details/8005877
Opticks源代码的编译:http://blog.csdn.net/hjh2005/article/details/7013323
Automated Python2 to 3 codetranslation: http://docs.python.org/2/library/2to3.html
Qt核心剖析: moc http://devbean.blog.51cto.com/448512/355100
UTF-8维基百科:http://zh.wikipedia.org/zh-cn/UTF-8
UTF-8文件的Unicode签名BOM(Byte OrderMark)问题:http://blog.csdn.net/thimin/article/details/1724393
C++字符串常量跨平台编译问题(与字符串编码相关):http://tianya.standsun.com/?p=569