ld: entry point (_main) undefined. for architecture arm64

ld: entry point (_main) undefined. for architecture arm64

就这个问题正正浪费了好几天时间啊。。。原来还是自己犯蠢,要哭死了、

首先进入targets-->Build Phases-->Compile Sources看看有没有导入main.m文件




该代码报告以下错误/usr/bin/ld: /tmp/ccQYa4bH.o: in function `hreal4_': read_AMSRE_Tb.f:(.text+0x9f): undefined reference to `sfstart_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0xc3): undefined reference to `sfn2index_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0xe2): undefined reference to `sfselect_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x123): undefined reference to `sfginfo_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x177): undefined reference to `sfrdata_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x189): undefined reference to `sfendacc_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x19b): undefined reference to `sfend_' /usr/bin/ld: /tmp/ccQYa4bH.o: in function `hint1_': read_AMSRE_Tb.f:(.text+0x244): undefined reference to `sfstart_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x268): undefined reference to `sfn2index_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x287): undefined reference to `sfselect_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x2c8): undefined reference to `sfginfo_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x31c): undefined reference to `sfrdata_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x32e): undefined reference to `sfendacc_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x340): undefined reference to `sfend_' /usr/bin/ld: /tmp/ccQYa4bH.o: in function `hint2_': read_AMSRE_Tb.f:(.text+0x3e9): undefined reference to `sfstart_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x40d): undefined reference to `sfn2index_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x42c): undefined reference to `sfselect_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x46d): undefined reference to `sfginfo_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x4c1): undefined reference to `sfrdata_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x4d3): undefined reference to `sfendacc_' /usr/bin/ld: read_AMSRE_Tb.f:(.text+0x4e5): undefined reference to `sfend_' collect2: error: ld returned 1 exit status
最新发布
05-29
<think>好的,用户现在需要解决两个问题:Fortran代码中sfrdata函数调用时的类型不匹配错误(INTEGER/REAL)以及链接器报错的未定义引用问题(如sfstart_,sfn2index_等)。我需要结合之前的讨论和用户提供的错误信息来给出解决方案。 首先,关于类型不匹配错误。用户之前的代码中,子程序hint1和hint2分别处理integer*1和integer*2类型的数据,而hreal4处理real*4类型。错误提示显示在调用sfrdata时,实际参数类型与预期不符。例如,在hint1中,dataset是integer*1,而sfrdata可能期望的是real*4。这可能是因为HDF库的Fortran接口中,sfrdata函数的参数类型不匹配。需要检查HDF库的文档,确认sfrdata的参数类型是否正确。例如,是否应该使用integer*1或integer*2数组,而不是real*4。或者,是否需要在调用时进行类型转换。 其次,链接器未定义引用的问题,如sfstart_、sfn2index_等,这可能是因为没有正确链接HDF库。用户需要在编译时添加-lhdf或相应的库路径。例如,使用gfortran编译时,可能需要指定-L/path/to/hdf/libs-lhdf。此外,Fortran的命名转换问题也可能导致符号名不一致,比如函数名在C和Fortran之间的下划线处理不同,需要确认库的命名约定是否匹配。接下来,我需要整理解决方案的步骤:1.**检查HDF库的函数接口**:确认sfrdata的参数类型。例如,HDF的Fortran接口可能要求dataset参数的类型与声明的data_type一致。例如,如果data_type是DFNT_INT8(对应integer*1),则dataset应为integer*1数组。2.**修正子程序中的类型声明**:在hint1中,dataset是integer*1,应该保持这种类型,而不是传递real*4。确保在调用sfrdata时传递正确的类型。3.**添加显式接口或模块**:使用interface块声明HDF函数的参数类型,帮助编译器检查类型匹配。例如,为sfstart、sfn2index等函数编写显式接口,确保参数类型和返回类型正确。 4. **解决链接器问题**:确保编译命令正确链接HDF库。例如,添加-lmfhdf-ldf-ljpeg -lz等库,具体取决于安装的HDF版本。5.**处理符号的下划线问题**:Fortran编译器通常会在函数名后添加下划线,而C库可能不加。可能需要使用编译选项如-fno-underscoring来调整,或者在声明函数时使用bind(C)来指定名称。 此外,用户代码中的implicit none被注释掉了,应该取消注释以确保所有变量显式声明,避免隐式类型问题。 最后,验证修改后的代码是否能正确编译和运行,确保类型匹配和库链接正确。</think>### 一、类型不匹配错误修复方案 #### 1. 错误根源分析 错误发生在`hint1`和`hint2`子程序调用`sfrdata`时,`dataset`参数类型与HDF库函数定义不匹配。HDF库的`sfrdata`函数要求输入参数类型与数据集的`data_type`属性严格匹配[^1]。 #### 2. 具体修复步骤 **(1) 检查HDF库函数接口定义** - 根据HDF4文档,`sfrdata`的第五个参数类型应与数据集的`data_type`一致: - `DFNT_INT8`对应`integer*1`(`INTEGER(1)`) - `DFNT_INT16`对应`integer*2`(`INTEGER(2)`) - `DFNT_FLOAT32`对应`real*4`(`REAL(4)`) **(2) 修改子程序参数类型** ```fortran ! 修改hint1子程序参数定义 subroutine hint1(sds_name,file_name,maxdim,dataset,dim_sizes) integer*1 :: dataset(maxdim) ! 保持与DFNT_INT8一致 ! 修改hint2子程序参数定义 subroutine hint2(sds_name,file_name,maxdim,dataset,dim_sizes) integer*2 :: dataset(maxdim) ! 保持与DFNT_INT16一致 ``` **(3) 添加显式接口声明** ```fortran interface integer function sfstart(filename, access_mode) character*(*) :: filename integer :: access_mode end function sfstart integer function sfn2index(sd_id, sds_name) integer :: sd_id character*(*) :: sds_name end function sfn2index end interface ``` ### 二、链接器未定义引用问题修复 #### 1. 库链接配置 在编译命令中添加HDF库路径及依赖库: ```bash gfortran -o read_AMSRE_Tb read_AMSRE_Tb.f90 -I/usr/local/hdf4/include \ -L/usr/local/hdf4/lib -lmfhdf -ldf -ljpeg -lz ``` #### 2. 符号命名规范处理 Fortran默认会在函数名后添加下划线,而C库可能不包含下划线。通过编译器选项强制统一命名: ```bash gfortran -fno-underscoring -o read_AMSRE_Tb read_AMSRE_Tb.f90 ... # 禁止自动添加下划线 ``` #### 3. 验证函数签名 使用`nm`命令检查库文件符号: ```bash nm -g libmfhdf.a | grep sfstart # 应输出类似: sfstart_ (带下划线) ``` ### 三、完整修复后的关键代码段 ```fortran ! 显式声明所有变量 program read_AMSRE_Tb implicit none ! 取消注释强制显式声明 ! 添加HDF库函数接口 interface integer function sfstart(filename, access_mode) bind(C, name='sfstart') use iso_c_binding character(kind=c_char) :: filename(*) integer(c_int), value :: access_mode end function sfstart end interface ! 修改后的hint2子程序 subroutine hint2(sds_name,file_name,maxdim,dataset,dim_sizes) character*80 :: sds_name, file_name integer*2 :: dataset(maxdim) ! 明确类型声明 integer :: dim_sizes(2) ! ... 其余代码保持不变 ... end subroutine hint2 ``` ### 四、验证指标 1. **编译成功**:无类型错误和链接错误 2. **运行时验证**:输出文件应包含有效亮度温度值$T_b \in [100, 300]$ 3. **内存检查**: ```bash valgrind --leak-check=full ./read_AMSRE_Tb ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值