LEDAPS1.3.0版本移植到windows平台----HuCal定标模块

时间:2023-03-08 16:38:13
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,原因不明,是代码本身的错误还是我移植的错?需要以后再仔细研究。