OS X上的Gcc:体系结构x86_64的未定义符号

时间:2014-12-22 18:09:30

标签: c macos gcc

我正在编写一个包含多个子目录的应用程序。我创建了一个Makefile结构,以便子目录编译文件并执行" ar rvs"和" ranlib libxxx.a"创建存档到父目录以进行链接。

然而," ld"命令遇到以下问题。

ld: warning: ignoring file ./libxxx.a, file was built for archive which is not
the architecture being linked (x86_64):
./libxxx.a Undefined symbols for architecture x86_64:

我在Mac OS X 10.10.1上使用gcc

我在这上面阅读了很多帖子。我试过" gcc -arch i386",然后我遇到了同样的i386错误

Undefined symbols for architecture i386:

我安装了gcc-4.9.2并尝试使用它而不是默认的gcc,没有运气。我尝试使用x86_64-apple-darwin14.0.0-g ++ - 4.9.2,这也没有帮助。

1 个答案:

答案 0 :(得分:1)

您看到的错误意味着您在构建中混合了i386和x86_64代码,并且您需要保持一致。除非有令人信服的理由不这样做(我很想知道它是什么),你应该只为64位编译所有内容。在Mac上使用gcc,这通常是默认设置,但您可以通过在编辑中添加-m64标志来强制它。一种方法是在CC="gcc -m64"命令行上设置make;还有其他更好的方法,但细节取决于您的makefile内容。

要解决:首先,删除您在项目区域中构建的所有库和对象代码(如果您编写了make clean目标,可能会clean执行此操作)。然后,最终取代CC或其标志(CFLAGS的值,但是如何构建CFLAGS取决于makefile),以便强制执行64位编译。然后确保你在所有编辑中都使用它。如果您没有看到-m64,则表示您遇到了问题。

如果必须使用32位,请将-m32替换为-m64

上面的讨论假设您使用gcc来运行ld命令。如果不是,那么在您使用gcc运行ld命令之前,您将独立完成。在我看来,你有更好的与生活有关的事情,而不是如何正确地运行ld命令;我当然有。