Concurrent cf77下替代lg()获取字符长度遇链接错误求助
解决方案:cf77编译器下替换原lg()函数的链接错误问题
我来帮你梳理下这个问题的核心原因和可行的解决方案:
1. 核心错误:错误声明len()为外部函数
Fortran标准中的len()是内置内部函数,编译器本身就有实现,不需要通过外部库链接。你添加的CEXTERNAL len声明会误导编译器,让它认为len()是一个用户自定义的外部函数,而非内置函数,这才导致了undefined reference to 'len'的链接错误。
解决第一步:立即移除代码中所有CEXTERNAL len的声明,让编译器使用内置的len()函数。
2. 确认原lg()的功能,选择正确的替代函数
你需要先明确旧平台上lg()函数的实际行为,再对应选择标准Fortran函数:
- 如果
lg(str)返回的是字符串的声明长度(即定义时指定的长度,不管实际内容是否有空格):直接用len(str)即可,这是标准用法,cf77完全支持。 - 如果
lg(str)返回的是去掉末尾空格后的有效字符长度:应该替换为len_trim(str),这也是Fortran标准内置函数,同样无需外部声明。
3. 修正编译链接命令的语法错误
你的链接命令存在语法问题:-o选项需要紧跟输出文件名,当前写法会把-Wl,...当成输出文件,这会导致链接过程异常,甚至间接影响函数符号的解析。
修正后的链接命令示例:
cf77 -g --cpu=pentium -o your_output_program $@ -Wl,-rpath-link=/usr/lib,-lc,/usr/lib/librt.a
注意:your_output_program要替换成你实际的可执行文件名,链接参数(-Wl,...)要放在源文件/目标文件之后。
另外,交叉编译32位程序时,要确保-rpath-link指定的路径中存在32位版本的librt.a和libc.so,否则仍可能出现类似__pthread_unwind@GLIBC_PRIVATE的未定义引用错误。
4. 备选方案:自定义实现替代函数(如果内置函数仍有问题)
如果上述方法仍无法解决(比如cf77对标准内置函数有特殊限制),可以自己实现一个简单的替代函数,完全模拟原lg()的行为:
! 模拟返回声明长度的lg() integer function my_len(str) character*(*) str my_len = len(str) end function my_len ! 如果原lg()是返回去掉末尾空格的长度,就改成: ! integer function my_len(str) ! character*(*) str ! my_len = len_trim(str) ! end function my_len
然后将原代码中所有lg()调用替换为my_len(),这样就完全避免了依赖编译器内置函数的问题,也不会有链接错误。
内容的提问来源于stack exchange,提问作者Denise P
相关产品推荐
相关产品推荐

