我正在try 编译一个用Fortran编写的软件,它还需要一些用C编写的库.该软件最初是在x86 Linux架构上编写的,但我正在try 用Apple Silicon(M1 Max)在我的Mac上编译它.我能够修改脚本和源代码以删除绝大多数错误和/或警告,但现在我不得不使用ranlib和ar来链接这些库.

编译时,生成的错误如下:

ar rv mapst.a \*.o

a - ispand.o

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: archive member: mapst.a(ispand.o) cputype (16777228) does not match previous archive members cputype (16777223) (all members must match)

rm -f ispand.o

ranlib mapst.a

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: archive member: mapst.a(ispand.o) cputype (16777228) does not match previous archive members cputype (16777223) (all members must match)

据我所知,问题出在编译器的标志上.目前,Makefile具有以下标志:

FTN = gfortran

FFLAGS = -O3 -Wuninitialized -fno-f2c -fno-automatic -fno-range-check -fno-backslash

CC = /usr/bin/gcc

CFLAGS = -c

将"-m64"添加到gfortran(顺便说一句,这是提供了brew 软件的GCC的编译器)标志中,没有任何变化,而向GCC标志中添加"-Arch Arm",会将体系 struct 从16777228更改为12,但无论如何错误仍然存在.

关于如何修改生成文件以编译软件,您有什么建议吗?

推荐答案

解决了!我发现这个问题与C和Fortran使用的编译器不同有关:GCC来自Xcode,而gfortran是使用BREW安装的.正如怀疑的那样,该问题与默认情况下为两种略有不同的体系 struct (GCC为arm64-apple-darwin23.1.0,Gfortran为x86_64-apple-darwin22)编译的库有关.我给GCC规则加了百旗来解决这个问题.谢谢大家!

C++相关问答推荐

为什么这个select()会阻止?

当包含头文件时,gcc会发出隐式函数声明警告

ATmega328P USART发送字符重复打印

Mise()在虚拟内存中做什么?

为什么写入系统调用打印的字符数不正确?

特定闪存扇区的内存别名

在C++中通过空指针隐式访问常量变量的值

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

是否需要包括<;errno.h>;才能使用perror?

tick.q中的Kdb+键控表语法

S和查尔有什么不同[1]?

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

为什么这个分配做得不好呢?

在C程序中使用Beaglebone Black UART的问题

错误:字符串在C中获得意外输出

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

即使客户端不发送数据,也会发生UNIX套接字读取

struct 中的qsort,但排序后的 struct 很乱

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

将十六进制值或十进制值分配给 uint16_t 有什么区别?