ld:为 macOS-x86_64 构建但试图 link 使用为 macOS-x86_64 构建的文件

ld: building for macOS-x86_64 but attempting to link with file built for macOS-x86_64

我有一个奇怪的问题,创建/使用静态库在我的 Ubuntu 虚拟机中有效,但在 macOS 中无效:

ld: warning: ignoring file ./dist/libXXXX.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64

创建静态库的命令是:

ar rcs libtest.a obj1.o obj2.o ...

编译器调用:

gcc -g -Wall -Wextra main.c -L./dist -lXXXX -o main

在 google 上搜索没有产生任何可用的结果,除了关于 SO 的这个(可能)相关问题:

Possible related question

在查看我自动创建静态库的脚本后,我找到了罪魁祸首:

出于某种原因,我的工具为头文件创建了目标文件(产生了像 header.h.o 这样的文件)。

删除那些解决了问题。

当我直接将这些目标文件而不是将它们收集到静态库中时,问题就解决了,即, gcc -g -Wall -Wextra main.c obj1.o obj2.o -o main

之后又收到了很多类似ld: warning: object file (obj1.o) was built for newer macOS version (11.0) than being linked (10.14)的警告,不过是警告,对象是链接的,所以问题解决了。

根本原因是某些库将 -mmacosx-version-min=10.14 传递给 gcc,因此目标文件是为 10.14 构建的,但我的 macos 现在是 11.0。

如果您想让事情正常进行,请尝试直接使用目标文件而不是创建静态库

如果你想解决所有的警告,找到``-mmacosx-version-min`并评论它。

我发现我的存储库中包含一些存档

rm -rf ./**/*.a
rm -rf ./**/.o
make

解决了我的问题