admin 管理员组

文章数量: 887007

之前搞全景拼接需要用到 Hugin,一个比较强大的开源图像拼接软件,最早在2009年左右就开始发布了,不过感谢作者的开源精神,其直到现在还在持续更新中(详戳 http://hugin.sourceforge/)。但是,也正因为如此,软件在更新的过程中不断引入了各种各样的功能,使得其本身就变得庞大,而且由于加入了各种各样的依赖,其依赖库也达到了十几二十个,编译后能达到几GB之巨。因此,想要从零开始编译 Hugin 还是比较繁琐和困难的,而且,网上即便官方英文编译教程也相对老旧,而现在 VS2015 以及 x64 也已经十分常用了,如果直接在 VS2015 上编译很有可能因为标准老旧的原因无法通过。所以,趁着项目的需要着手把这些坑填了,也当作给后面的同仁一些参考吧。不过这毕竟只是我自己的电脑,不排除大家在编译过程中会遇到一些未提及的问题,另外教程中所提到的一些BUG也有可能在新版本中已经修复,大家可根据自己的情况处理。

首先注意VS的版本和年份,MSVC10, 14, 15 对应的分别是 2010, 2015, 2017。在编译依赖包的时候注意多阅读里面的 README 或者 INSTALL 文件,毕竟它们是对该工程基本内容以及编译建立方法的最官方的介绍。这个链接(1)https://wiki.panotools/Hugin_SDK_(MSVC_2013) 详细介绍了在 VS2013 上建立 Hugin 工程的步骤,不过版本相对老旧,有些步骤在 VS2015 环境可能会出现错误,不过可作为比较好的参考。为了便于管理,建立Hugin工程的根目录,用来存放相关的源码和编译文件,这里以 ROOT 表示,根据喜好自己修改。所有依赖包也放在这个目录里面。注意最好保留10GB左右的空间。

1. wxWidgets-3.1.2

下载 https://www.wxwidgets/downloads/

解压到 ROOT/wx_ROOT/。直接进入 build/msw/,选择相应VS版本的解决方案文件打开,VS2015 对应的是 wx_vc14.sln,分别选择 DLL DebugDLL Release 以及 x64 平台,点击菜单栏 生成解决方案,即可完成编译。生成的.lib和.dll文件在 lib/wx_x64_dll/ 中。

docs/msw/install.md 文件以及链接(1)中也提到可以打开相应版本的 Visual Studio Command Prompt 或者称为开发人员命令提示(在“开始”菜单 VS2015 目录下的 Tools 目录中),并使用内置的 nmake 命令来进行编译。进入 wx_ROOT 目录,对于64位 DLL 的编译,可以使用以下命令,产生文件在 lib/vc_x64_dll

$ nmake -f makefile.vc BUILD=debug TARGET_CPU=AMD64 SHARED=1 USE_OPENGL=1 RUNTIME_LIBS=dynamic
$ nmake -f makefile.vc BUILD=release TARGET_CPU=AMD64 SHARED=1 USE_OPENGL=1 RUNTIME_LIBS=dynamic

在编译64位 DLL 的时候可能会有些问题,如下图所示,应该是混用了32位和64位的编译与链接工具的原因,因为该目录下存放的是32位的编译工具,相应64位的编译工具在 x86_amd64 或者 amd64 下。这个问题或许能通过配置相应的环境变量解决,不过为了方便最好还是直接使用IDE编译。

2. zlib-1.2.11

下载 http://www.zlib/

解压到 ROOT/zlib_ROOT/zlib-1.2.11/ 作为源码目录。zlib_ROOT 用于存放 lib, bin, include 等目录,方便管理。用 CMake 打开,选择 source 目录,build 目录最好单独作为一个目录,一般放在源码目录下,如 zlib-1.2.11/build/。点击 configure ,选择 Visual studio 14 2015,平台选择 x64,确定,片刻后如果没问题会提示 Configuring done,有问题也没关系,两种情况下都要手动配置一些属性。勾选右上角的 Advanced,可以看到所有的属性。修改以下属性:

CMAKE_INSTALL_PREFIX = ROOT/zlib_ROOT/
INSTALL_[BIN, …]_DIR = ROOT/zlib_ROOT/[bin, …]

再次点击 configure,提示 Configuring done 后,点击 generate。完成后可以直接点击 Open Project,或者在 build 目录下找到 .sln 文件打开即可。分别选择 DebugRelease ,编译生成解决方案,然后选择 INSTALL,右键选择生成,相关的文件就会被复制到 zlib_ROOT 相应的目录下。

3. OpenEXR-2.3.0

下载 https://github/openexr/openexr/blob/master/INSTALL.md

OpenEXR 依赖 Zlib,所以上一步要先完成。其同样依赖 IlmBase,按照 链接(1)的步骤应该先编译安装 IlmBase。不过官方在 github 上提供了一种整合简便的方法,也就是上面的链接。下载后解压到 ROOT/OpenEXR_ROOT/OpenEXR-2.3.0/。参照 Zlib,打开 CMake,修改以下属性。

CMAKE_INSTALL_PREFIX = ROOT/OpenEXR_ROOT/
ILMBASE_PACKAGE_PREFIX = ROOT/ OpenEXR_ROOT/
OPENEXR_PACKAGE_PREFIX = ROOT/ OpenEXR_ROOT/
ZLIB_INCLUDE_DIR = ROOT/zlib_ROOT/include
ZLIB_LIBRARY_DEBUG = ROOT/zlib_ROOT/lib/zlibd.lib
ZLIB_LIBRARY_RELEASE = ROOT/zlib_ROOT/lib/zlib.lib

只需勾选 OPENEXR_BUILD_ILMBASE, OPENEXR_BUILD_OPENEXROPENEXR_BUILD_SHAREDCPACK_BINARY_NSIS。其他需要勾选的留空即可。注意 ILMBASE_PACKAGE_PREFIXOPENEXR_PACKAGE_PREFIX 默认是没有的,需要点击 Add Entry,选择 PATH,然后配置。实际上这两个属性是用来指定 DLL 文件的安装路径即 bin 目录的,默认会放在 CMAKE_INSTALL_PREDIX 的目录下。但是在
OpenEXR_ROOT/OpenEXR-2.3.0/OpenEXR/IlmImf/CMakeLists.txt 中有点 BUG,需要在前面加上下面内容,否则如果不配置 OPENEXR_BUILD_OPENEXR,会导致 IlmImf.dll 找不到正确的安装路径,当然也可以手动复制。如果修复了以下 BUG,那么两者都不需要配置。

IF (NOT OPENEXR_PACKAGE_PREFIX)
SET (OPENEXR_PACKAGE_PREFIX ${CMAKE_INSTALL_PREFIX})
ENDIF ()

Configuring done 后点击 generate,打开 build 目录下的 .sln 文件,编译生成解决方案,选择 INSTALL 右键选择生成。如无意外完成 OpenEXR 的安装。

4. libpng-1.6.37

下载 https://sourceforge/projects/libpng/files/

解压到 ROOT/png_ROOT/png-1.6.37/。打开 CMake,第一次 configure 的时候可能会提示计算机缺少 mspdb140.dll,因为其默认用的是 x86_amd64 的工具,可以查看目录 C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/ 下是没有该 DLL 的。不断点击确定,然后修改和 VS 相关的属性,包括 CMAKE_ASM_COMPILERCMAKE_LINKER ,将 x86_amd64 改为 amd64 即可。顺便配置 Zlib 的相关路径,修改以下属性。

CMAKE_INSTALL_PREFIX = ROOT/png_ROOT/libpng
PNG_STATIC = NO
PNG_SHARED = YES

Configuring done 后点击 generate,打开 build 目录下的 .sln 文件,编译生成解决方案,选择 INSTALL 右键选择生成。如无意外完成 libpng 的安装。

5. jpeg-9a

下载 http://www.ijg/files/

解压到 ROOT/jpeg_ROOT/jpeg-9a/libjpeg 的安装跟前面不太一样,主要还是参照 链接(1)的做法。里面需要用到 VS 自带的 nmake 工具。首先以文本方式打开 makefile.vc,在第12行前加 #,应该是注释掉的意思,即

!include <win32.mak> 改为 #!include <win32.mak>

然后修改 jmorecfg.h 第 246 和 248 行,即

#define GLOBAL(type) type
#define EXTERN(type) extern type
改为
#define GLOBAL(type) __declspec(dllexport) type
#define EXTERN(type) extern __declspec(dllexport) type

注意解压目录有没有带有 v10 后缀的文件,带有 v10 说明需要使用 VS2010 的 nmake 命令行工具,这里之所以选择 jpeg-9a 是因为其包含了后缀为 v10 的文件,对于之后的 jpeg-9b 和 9c 他们都只包含了 v15 即需要使用 VS2017 的 namke 工具。由于 VS2017 没有安装,所以只好用 VS2010 的版本。
在菜单栏打开 VS2010 目录,在 Tools 目录下,打开 x64 Win64 Command Prompt,进入 jpeg-9a 目录,执行以下命令。注意命令执行成功后相关带有 v10 后缀的文件会消失,然后目录下会生成相应的 VS 工程文件。直接用 VS2015 打开 jpeg.sln,点击升级相关的依赖库即可。

$ nmake –f makefile.vc setup-v10

注意这时得到的 VS 工程只包含 Release Win32 的编译选项,下拉 Win32 菜单栏,选择 配置管理器,下拉选择 x64 解决平台,从Win32 复制,确定。选择 jpeg 工程右键点击属性,将 常规->配置类型 改为 动态库(.dll),生成即可。相关文件在 x64/Release/ 目录下。没有 Debug。

6. tiff-4.0.10

下载 http://download.osgeo/libtiff/

解压到 ROOT/tiff_ROOT/tiff-4.0.10。这个比较简单,打开 CMake,配置相应的 CMAKE_INSTALL_PREFIX 以及 JPEGZLIB 的路径即可。

7. vigra-1.11.1

下载 https://ukoethe.github.io/vigra/#download

解压到 ROOT/vigra_ROOT/vigra-1.11.1。打开 CMake,修改以下属性

AUTOBUILD_TESTS = NO
AUTOEXEC_TESTS = NO
WITH_HDF5 = NO
WITH_OPENEXR = YES
WITH_VALGRIND = NO
WITH_VIGRANUMPY = NO
CMAKE_INSTALL_PREFIX = ROOT/vigra_ROOT/
CMAKE_CXX_FLAGS = /DWIN32 /D_WINDOWS /W3 /GR /EHsc /DOPENEXR_DLL

然后分别配置 ZLIB, JPEG, PNG, TIFF的相关路径。点击 configure,因为勾选了 WITH_OPENEXR,所以这时需要配置 OPENEXR 的相关路径。由于 LIBRARY_PATH 不分 ReleaseDebug,所以如果想把两者的路径都包含进去,可以采用以下写法。不过最后编译安装只使用 Release 版本,所以也可以省去 Debug 库的配置。

OPENEXR_INCLUDE_DIR = ROOT/OpenEXR_ROOT/include/OpenEXR
OPENEXR_?_LIBRARY = optimized;${Release_lib};debug;${Debug_lib}

再次点击 configure,然后 generate。打开 build 目录下的 vigra.sln,选择 Release x64 直接选项 INSTALL 右键生成即可。

8. expat-2.2.7

下载 https://sourceforge/projects/expat/

解压到 ROOT/expat_ROOT/expat-2.2.7。打开 CMake,配置安装目录,然后 configure 以及 generate,打开 build 目录下的 expat.sln 生成解决方案然后 INSTALL 即可。

9. Exiv2-0.27.2

下载 https://www.exiv2/download.html

解压到 ROOT/exiv2_ROOT/Exiv2-0.27.2。打开 CMake,配置 ZLIBEXPAT 以及安装路径,只勾选

EXIV2_ENABLE_LENSDATA, EXIV2_ENABLE_PNG, EXIV2_ENABLE_SHARED, EXIV2_ENABLE_XMP

然后 configure 以及 generate,打开 build 目录下的 exiv2.sln 选择 Release 生成解决方案然后 INSTALL 即可。

10. glew-2.1.0

下载 https://sourceforge/projects/glew/files/glew/

解压到 ROOT/glew_ROOT/glew-2.1.0,直接打开 build/vc10,用 VS2015 打开 glew.sln,分别选择 DebugRelease以及 x64 平台生成解决方案即可。

11. lcms2

下载 https://github/mm2/Little-CMS

解压到 ROOT/lcms2_ROOT/Little-CMS。直接打开 Projects/VC2015/lcms2.sln,选择 Release x64,选择 lcms2_DLL 右键生成即可。相关文件在 bin 目录下。

12. gettext-0.20.1

下载 https://mlocati.github.io/articles/gettext-iconv-windows.html

选择 64 位 shared 下载即可。解压到 ROOT/gettext_ROOT/ 即可,不需要重新编译。

13. sqlite-3.29.0

下载 https://www.sqlite/download.html

需要下载 sqlite-amalgamationsqlite-dll-win64。首先把 sqlite-amalgamation 里的文件提取到 ROOT/sqlite3_ROOT/,注意 不需要 有子目录。打开 VS2015 Command Prompt,进入目录,执行以下 第一条 命令。然后再把 sqlite-dll-win64 里的文件复制到 sqlite3_ROOT 目录下,执行 第二条 命令。注意,必须按照上述步骤执行,不能先把两个压缩包都解压后再执行命令,因为第一条命令生成的 sqlite3.dll 是 32 位的,会覆盖掉原始的 64 位 DLL 文件!需要查看 DLL 或者 EXE 文件的位数可以用 UltraEdit 二进制方式打开,查看前面的字段,如果有 PE…L 字样的为 32 位,PE…d 则为 64 位。

$ cl /D_USRDLL /D_WINDLL /MD /D_MBCS /DSQLITE_ENABLE_COLUMN_METADATA /D"SQLITE_API=extern __declspec(dllexport)" sqlite3.c /link /DLL /OUT:sqlite3.dll
$ lib /def:sqlite3.def /machine:x64

14. exiftool-11.60

下载 http://owl.phy.queensu.ca/~phil/exiftool/

选择 Windows Executable 下载即可。解压到 ROOT/exiftool_ROOT/,并将 exiftool(-k).exe 重命名为 exiftool.exe 即可。

15. enblend-4.2

下载 https://jaist.dl.sourceforge/project/enblend/enblend-enfuse/enblend-enfuse-4.2/

下载 Win64 版本解压即可。也可以选择自己编译。

16. Python3

选择安装包安装即可,注意记得勾选将安装路径加到环境变量中。

17. NSIS

下载 https://nsis.sourceforge.io/Download

NSIS 可以用来将编译好的程序打包成安装包,如果需要的话可以下载,然后安装即可。这里使用的是 nsis-2.51,使用最新版 nsis-3.04 好像会有问题无法生成安装包。

18. swig-4.0.0

下载 http://swig.sourceforge/download.html

选择 swigwin 下载编译好的可执行文件解压即可。

19. libpano13-2.9.20

下载 https://sourceforge/projects/panotools/files/

解压到 ROOT/libpano13_ROOT/libpano13-2.9.20,打开 CMake,配置 ZLIB, JPEG, PNG, TIFF 以及安装的路径。分别选择 DebugRelease 选择 INSTALL 生成即可。

20. hugin-2019.0.0

下载 https://sourceforge/projects/hugin/files/hugin/

解压到 ROOT/hugin_ROOT/hugin-2019.0.0。打开 CMake,设置 build 目录为 ROOT/hugin_ROOT/hugin_2019_build/,当然也可以设成其他路径。设置以下选项,注意如果 wxWidgets 解压目录不包含中间路径 wx_ROOT 的话可以不设置 wxWidgets_ROOT_DIR,但要设置 wxWidgets_ROOT_SUFFIX,并且解压目录名称必须为 wxWidgets-3.1.2,具体可以阅读该目录下的 CMakeLists.txt

CMAKE_INSTALL_PREFIX = ROOT/hugin_ROOT/hugin_2019_build/INSTALL/FILES
wxWidgets_LIB_DIR = ROOT/wx_ROOT/wxWidgets-3.1.2/lib/vc_x64_dll
wxWidgets_ROOT_DIR = ROOT/wx_ROOT/wxWidgets-3.1.2/
wxWidgets_ROOT_SUFFIX = 3.1.2

点击 configure。重复 configure,设置 TIFF, JPEG, PNG, ZLIB, OPENEXR, VIGRA, EXIV2, GLEW, PANO13 等相关的 INCLUDE_DIRLIB_DIRWX_xxx 相关的不用修改。注意以下两个 INCLUDE_DIR

OPENEXR_INCLUDE_DIR = ROOT/OpenEXR_ROOT/include/OpenEXR
VIGRA_INCLUDE_DIR = ROOT/vigra_ROOT/include

后面还要设置 enblend 目录以及其他依赖库的路径都大同小异,依次填写即可,有些选项不涉及前面已经安装的依赖库可以不填写。之后需要配置各依赖库的 DLL 路径,如果有 Debug 和 Release 两种的可以用分号隔开,不需要像 .lib 那样加上 optimized 或者 debug。实际上 CMakeLists.txt 中只定义了 RelWithDebInfo,其中动态依赖库使用的是 Release 版本而 hugin 本身使用的是 Debug 版本。注意一些选项。

BUILD_HSI = YES
BUILD_HUGINSETUP = YES
OPENEXR_BIN_BINARY = ROOT/OpenEXR_ROOT/bin
MSGFMT_EXECUTABLE = ROOT/gettext _ROOT/bin/msgfmt.exe
SWIG_EXECUTABLE = ROOT/swig_ROOT/swigwin-4.0.0/swig.exe
HUGIN_BUILDER = XXX

如果想把编译好的程序打包成安装包,可以先安装 NSIS,然后配置选项 MAKENSIS_EXECUTABLE 为安装目录下的 makensis.exe 即可。点击 configure,如无意外则完成。点击 generate,打开 .sln 文件。注意程序可能存在一点 BUG,如果直接生成解决方案可能会出现以下两个错误。

SrcPanoImage.cpp(329): error C2039: “Error”: 不是“Exiv2”的成员
RawImport.cpp(357): error C2039: “Error”: 不是“Exiv2”的成员

打开这两个文件,在开头处加上 #include <exiv2/error.h> 即可。记得选择 RelWithDebInfo 点击生成解决方案,完成编译后选择 INSTALL 右键点击生成,相关的 .exe.dll 以及其他文件将会被复制到 CMAKE_INSTALL_PREFIX 目录下,这里是 build/INSTALL/FILES/

需要运行的话可以直接打开 bin/ 目录下的 hugin.exe。或者在 VS2015 下选择 hugin 工程设为 启动项,然后按 F5 或者 Ctrl+F5,这时需要打开 属性 进行以下配置,否则直接运行会找不到相关的 dll 文件。对于其他的工程例如 nona 也可以按照同样的步骤设置。最后一个设置是为了更改程序之后更新到安装目录下,也可以选择 INSTALL 右键选择生成。记得选择 RelWithDebInfo x64

调试->命令:$(SolutionDir)INSTALL\FILES\bin$(TargetFileName)
调试->工作目录:$(SolutionDir)INSTALL\FILES\bin
生成事件->后期生成事件->命令行:copy $(TargetPath) $(SolutionDir)INSTALL\FILES\bin$(TargetFileName)

本文标签: 环境 visual Hugin Studio