【问题标题】:Gcc on OS X: Undefined symbols for architecture x86_64OS X 上的 Gcc:架构 x86_64 的未定义符号
【发布时间】:2014-12-22 18:09:30
【问题描述】:

我正在编写一个具有多个子目录的应用程序。我创建了一个 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 也没有帮助。

【问题讨论】:

    标签: c macos gcc


    【解决方案1】:

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

    要解决:首先,删除您在项目区域中构建的所有库和目标代码(也许make clean 会这样做 - 如果您编写了clean 目标)。然后,调整CC 的值或其标志(最终为CFLAGS,但CFLAGS 的构建方式取决于makefile),以便强制执行64 位编译。然后确保您在所有编译中都使用它。如果您没有看到-m64,那么您就有问题了。

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

    上面的讨论假设您使用gcc 来运行ld 命令。如果不是,那么在您使用gcc 运行ld 命令之前,您只能靠自己。在我看来,除了弄清楚如何正确运行ld 命令之外,你还有更好的生活要做;我当然有。

    【讨论】:

    • 感谢您的回复。我试过“CC=gcc -m64”,我也用gcc来运行ld命令。但结果是一样的。我只尝试了 -m32 选项,看看如果我让它保持一致,它是否有效,但没有其他原因。
    • 除非我们看到重现问题的最小生成文件,否则没有人可以为您提供更多帮助。阅读有关如何创建 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 或 SSCCE (Short, Self-Contained, Correct Example) 的信息——两个名称和链接用于相同的想法。您的 MCVE 代码可能应该是库的一个最小源文件(和头文件)(void libfunc(void) { printf("%s called\n", __func__); },以及调用库函数的主程序,加上一两个生成文件,具体取决于内容的布局方式。
    • 谢谢。会看的。
    猜你喜欢
    • 2012-08-04
    • 2012-04-26
    • 2017-08-21
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多