- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个大型的混合 C/Fortran 代码库,目前使用英特尔工具在 Windows 上编译。我被要求将它移植到 Linux 上的 GNU 工具。或多或少是随机的,我选择了 4.8 版。
如果从 Fortran 调用 C 函数,互操作性通常如下所示:
// C code:
void PRINTSTR(char *str, size_t len) {
for(int ii = 0; ii < len; ii++) {
putchar(str[ii]);
}
putchar('\n');
}
!Fortran code:
program test
implicit none
call printstr("Hello, world.")
end
英特尔 Fortran 编译器始终生成大写符号,因此可以正常工作。但是 GNU Fortran 编译器总是生成小写符号,因此存在链接器错误。
GNU Fortran 编译器过去有一个名为 -fcase-upper
的选项,它可以生成大写符号,但似乎这对每个人来说都太可配置了,它已被删除(我我不确定什么时候)。
可以使用 ISO_C_BINDING
工具强制编译器生成区分大小写的名称:
program test
interface
subroutine printstr(str) bind(C, name='PRINTSTR')
character :: str(*)
end subroutine
end interface
call printstr("Hello, world.")
end
这解决了链接器错误,但它改变了字符串参数的处理方式;不再提供长度参数。因此,要使用此方法,我不仅必须为当前以这种方式工作的每个函数添加接口(interface)定义,而且我还必须更改在每次调用此类函数时处理字符串的方式,确保所有字符串以 null 结尾。
我可以把所有这些函数都变成小写,但当然英特尔编译器仍然会生成大写符号,所以这会破坏现有的构建。
由于有大约 2,000 个这样的函数,这似乎是一项不可行的工作量。所以,我的问题是:如何在不更改函数调用语义且不破坏使用英特尔编译器的现有构建的情况下解决链接错误?
最佳答案
要解决链接器错误,您可以用其他方法解决。使用英特尔编译器选项 names将外部名称转换为小写以匹配默认的 GNU Fortran 选项。并在 c 中转换名称也小写:
void printstr(char *str, size_t len) {...}
我个人建议使用 -funderscoring
和英特尔的 /assume:underscore
来区分旨在实现互操作性的功能。
// C code:
void printstr_(char *str, size_t len) {...}
!Fortran code:
program test
implicit none
call printstr("Hello, world.")
end
关于c++ - GNU Fortran 和 C 互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374796/
我是一名优秀的程序员,十分优秀!