LEDAPS1.3.0版本移植到windows平台----HuCal定标模块
这个是2012年左右放在百度空间的,谁知百度空间关闭。。。转移到博客园。
最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富。
HuCal是将LEDAPS项目中的TM/ETM+大气校正流程系列算法中的辐射定标模块由linux系统移植到windows下的产物,代码本身改动不大,使用接口不变。
包含文件:
HuCal.exe
geotiff.dll
hd423m.dll
hm423m.dll
命令行调用示例:HuCal.exe空格D:\LEDAPS\lndcal.L5014033_03320060801.txt
遇到的问题及解决方案:
出现问题1:无法打开文件"LIBC.lib"。
解决:在“项目”-->“配置属性->链接器->输入->忽略特定库”后填入“LIBC.lib ”。
LIBC.lib介绍 google一下,libc.lib原来是被遗弃的可怜家伙。MSDN Labs: What''s New in Visual C++ 2005 Quote: The single-threaded CRT libraries, , msvcrt.lib, and msvcrtd.lib, . Use the multi-threaded CRT libraries. The /MD, /ML, /MT, /LD (Use Run-Time Library) compiler flag is no longer supported. Non-locking versions of some functions have been added in cases where the performance difference between the multithreaded code and the single-threaded code is potentially significant. 要解决问题的话,只要在链接设置那里忽略它就没问题了。下面再列点抄点总结: ?Run-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。 C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。 C Run-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。 ?动态链接库版本:/MD Multithreaded DLL 使用导入库MSVCRT.LIB/MDd Debug Multithreaded DLL 使用导入库MSVCRTD.LIB ?静态库版本:/ML Single-Threaded 使用静态库LIBC.LIB/MLd Debug Single-Threaded 使用静态库LIBCD.LIB/MT Multithreaded 使用静态库LIBCMT.LIB/MTd Debug Multithreaded 使用静态库LIBCMTD.LIB 若要使用此运行时库请忽略这些库 单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
所以最后忽略的库包括:libc.lib;libcmtd.lib
出现问题2:代码中使用linux平台的头文件"unistd.h"。
解决:使用#include "unistd.h"替代#include <unistd.h>
并直接添加unistd.h文件到vs2005项目中。文件内容如下:
#ifndef _UNISTD_H
#define _UNISTD_H 1
/* This file intended to serve as a drop-in replacement for
* unistd.h on Windows
* Please add functionality as neeeded
*/
#include <stdlib.h>
#include <io.h>
#include "getopt.h" /* getopt from: http://www.pwilson.net/sample.html. */
#include <process.h> /* for getpid() and the exec..() family */
#define srandom srand
#define random rand
//const W_OK = 2;// 因为重复定义而注释掉
//const R_OK = 4;
#define access _access
#define ftruncate _chsize
#define ssize_t int
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
/* should be in some equivalent to <sys/types.h> */
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
#endif /* unistd.h */
文件中包含的getopt.h文件从网站 http://www.pwilson.net/sample.html. 下载。
这个解决方案是网上有人针对linux移植到windows所专门重写的代码,用的不多,需要验证。
出现问题3:代码中使用的相关库在linux平台与windows平台是不同的,需要逐个替换,主要是HDF4库、geotiff库与HDF-EOS库。
解决:
包含的静态库有:
geotiff_i.lib
libtiff_i.lib
ws2_32.lib
gctp.lib
hdfeos.lib
hd423m.lib
hm423m.lib
另外程序执行时需要动态库:geotiff.dll;hd423m.dll;hm423m.dll
出现问题4:代码执行过程内存一直在涨啊?最后能涨到300,原因不明,是代码本身的错误还是我移植的错?需要以后再仔细研究。