netCDF 4.3.0 通过 cmake 来提供跨平台的编译支持。
然而,编译中有许多依赖库也需要编译,过程颇为复杂。 本文记录备忘。
主要参考 http://gmtrac.soest.hawaii.edu/projects/gmt/wiki/BuildingNetCDF
步骤基本相同,细节略有差异。
本例的系统是 Win7 x64。 本文中编译均是 32位。
需要编译的软件均以 D:\software 为 ROOT。
源码统一放在 D:\software\src 下。
系统中已经安装了 VS2008
所有控制台操作均在 VS2008/Tools/VS2008命令提示窗口中进行。
步骤如下
1. 下载 HDF 4.2.9 的二进制共享版版, 安装后的目录是
C:\Program Files (x86)\HDF_Group\HDF\4.2.9
2. 下载 HDF5 1.8.10 的二进制共享版,安装后的目录是
C:\Program Files (x86)\HDF_Group\HDF5\1.8.10
3. 编译 cURL 7.24.0 。其它版本可能有问题。
3.1. 将源码解压到 D:\software\src\curl-7.24.0
3.2. 修改 D:\software\src\curl-7.24.0\CMakeLists.txt
--- curl-7.24.0/CMakeLists.txt.orig 2012-02-27 11:44:29.000000000 +0100
+++ curl-7.24.0/CMakeLists.txt 2012-02-27 11:44:29.000000000 +0100
@@ -148,9 +148,9 @@
mark_as_advanced(ENABLE_IPV6)
if(WIN32)
- find_library(WSOCK32_LIBRARY wsock32)
- find_library(WS2_32_LIBRARY ws2_32)
- list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES ${WSOCK32_LIBRARY} ${WS2_32_LIBRARY}) # bufferoverflowu.lib
+ # Windows standard libraries are located in C:/Program Files/Microsoft SDKs/[...]
+ # They are already included in the default MSVC LIBPATH => no find_library is needed!
+ list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wsock32.lib ws2_32.lib)
if(CURL_DISABLE_LDAP)
# Remove wldap32.lib from space-separated list
string(REPLACE " " ";" _LIST ${CMAKE_C_STANDARD_LIBRARIES})
3.3 运行如下命令
d:
cd d:\software\src\curl-7.24.0\
mkdir build
cd build
cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=d:\software -DCMAKE_BUILD_TYPE=Release -DCMAKE_FIND_ROOT_PATH="C:\Program Files (x86)\HDF_Group\HDF5\1.8.10" -DCMAKE_USE_OPENSSL=OFF ..
这里,-DCMAKE_INSTALL_PREFIX=d:\software 表示未来的安装目录。CMake会优先到CMAKE_INSTALL_PREFIX/lib 和 CMAKE_INSTALL_PREFIX/include 中寻找依赖库,因此对于从源码编译的有依赖关系的软件,均指定相同的CMAKE_INSTALL_PREFIX是有好处的。
-DCMAKE_FIND_ROOT_PATH="C:\Program Files (x86)\HDF_Group\HDF5\1.8.10" 的目的是为了使用hdf5中包含的zlib库。
然后
nmake
nmake install
4. 编译 XDR
4.1 从 svn://gmtserver.soest.hawaii.edu/gmt5/sandbox/win32-dev/bsd-xdr 检出源码到 d:\software\src\bsd-xdr
4.2 编辑其中的 cmake/ConfigUser.cmake
修改 CMAKE_INSTALL_PREFIX 的值为 d:/software
4.3
cd bsd-xdr
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
nmake install
d:\software\bin\xdrsizeof_test 工作正常表示编译正确
5. 编译 netcdf 4.3.0
解压 netcdr 4.3.0的源码到 d:\software\src\netcdf-4.3.0\
编辑其中的 cmake/ConfigUser.cmake 设定 HDF, xdr 等的正确路径。本例中
# Where netcdf will be installed:
set (CMAKE_INSTALL_PREFIX d:/software)
# General root path to include and lib dirs:
set (CMAKE_FIND_ROOT_PATH d:/software)
# Location of HFD4, HDF5 and zlib
set (ENV{HDF4_ROOT} "C:\Program Files (x86)\HDF_Group\HDF\4.2.9")
set (ENV{HDF5_ROOT} "C:\Program Files (x86)\HDF_Group\HDF5\1.8.10")
set (ENV{ZLIB_ROOT} "$ENV{HDF5_ROOT}")
# Root directories of libs that are not in CMAKE_FIND_ROOT_PATH:
set (CURL_ROOT d:/software)
set (XDR_ROOT d:/software)
然后运行命令
cd netcdf-4.3.0
mkdir build
cd build
D:\software\bin>cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=d:\software -DCMAKE_BUILD_TYPE=Release -DCMAKE_FIND_ROOT_PATH="C:\Program Files (x86)\HDF_Group\HDF5\1.8.10\cmake" ..
nmake
nmake install
6. 将
C:\Program Files (x86)\HDF_Group\HDF\4.2.9\bin
C:\Program Files (x86)\HDF_Group\HDF5\1.8.10\bin
d:\software\lib
三个目录中的所有文件copy 到d:\software\bin 中。
7. 测试
cd d:\software\bin
ncdump 可以看到命令提示信息。
这个工作的关键是要理解 CMake查找依赖库的方式。建议仔细阅读
http://www.vtk.org/Wiki/CMake:How_To_Find_Libraries
中Using external libraries一节。