我正在尝试编译示例程序以使用HDF-EOS。示例代码取自HDF-EOS website(因此我只会在顶部发布):
/* This example shows how to read a data field in HDF-EOS2 grid data. */
#include <mfhdf.h>
#include <hdf.h>
#include <HdfEosDef.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int32 gridfile1;
int32 grid1;
int32 datafield1rank;
int32 datafield1dimsize[32];
int32 datafield1type;
char datafield1dimname[512];
float32 *datafield1data;
int32 i, j;
/* Open 'AMSR_E_L3_RainGrid_B05_200707.hdf' using grid API */
if ((gridfile1 = GDopen("AMSR_E_L3_RainGrid_B05_200707.hdf", DFACC_RDONLY)) == -1) {
fprintf(stderr, "error: cannot open grid 'AMSR_E_L3_RainGrid_B05_200707.hdf'\n");
return -1;
}
return 0;
相应的make文件如下所示:
HDF4_DIR=<hdf4_path>
HDFEOS2_DIR=<hdfeos2_path>
CC=$(HDF4_DIR)/bin/h4cc
CFLAGS=-I$(HDFEOS2_DIR)/include
LDFLAGS=-L$(HDFEOS2_DIR)/lib
LIBS=-lhdfeos -lGctp
read_grid: read_grid.c
$(CC) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@
除了上面提到的路径,我还添加了到hdf5库的链接,所以我的make文件看起来像这样:
HDF4_DIR=<hdf4_path>
HDFEOS2_DIR=<hdfeos2_path>
HDF5_DIR=<hdf5_path>
CC=$(HDF4_DIR)/bin/h4cc
CFLAGS=-I$(HDFEOS2_DIR)/include -I$(HDF4_DIR)/include -I$(HDF5_DIR)/include
LDFLAGS=-L$(HDFEOS2_DIR)/lib64 -L$(HDF4_DIR)/lib64 -L$(HDF5_DIR)/lib64
LIBS=-lhdfeos -lGctp
read_grid: read_grid.c
$(CC) read_hdf_eos.c $(CFLAGS) $(LDFLAGS) $(LIBS) -o $@
现在的问题是它没有编译,抛出像这样的链接错误:
<hdfeos2_path>/lib64/libhdfeos.a(GDapi.o): In function `lamazDxDtheta':
<hdfeos2_path>/src/GDapi.c:9579: undefined reference to `sin'
<hdfeos2_path>/src/GDapi.c:9580: undefined reference to `sin'
...
collect2: error: ld returned 1 exit status
所以对我来说,这看起来像一个链接问题,但我不明白为什么。 为了增加混乱,我得到另一个错误:
read_grid.o: In function `main':
read_grid.c:(.text.startup+0x0): multiple definition of `main'
read_grid.o:read_grid.c:(.text.startup+0x0): first defined here
当然,我没有多次定义main
。在抛出相同链接错误的第二个示例程序中,我没有收到此错误。
因此,如果有人对第一个问题有了解,那就是链接,我会非常高兴。
解决方案:
main
问题感谢您的评论和提示。