我正在编写一个包含多个子目录的应用程序。我创建了一个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,这也没有帮助。
答案 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
命令;我当然有。