苹果Mach-O的连接错误,由于文件扩展名
可怕的典型链接错误..苹果Mach-O的连接错误,由于文件扩展名
LD:符号(S)没有发现架构的ARMv6 collect2:LD返回1退出状态
然而,它是由文件名引起的?我使用C++/Objective-C,因此我所有的Obj-C文件都是.mm,但我永远不能使用任何.c文件。例如,我在我的项目中包含了SFMT算法,它给了我这些错误,但只是将单个.c文件更改为.cpp使其消失,代码工作得很好!我只包括标题,所以我不知道为什么这会产生任何影响。
现在的问题是我想包括Freetype2,给我同样的问题(很确定这是因为它是.c),但是这太大了,无法重命名每个文件,我也使用链接二进制,所以除非我用新文件名重新编译它,我无法改变它。所以现在是时候找到背后的真正原因。
任何想法为什么会发生这种情况?如何停止.c文件的链接器错误?
包装你的Freetype包括extern "C"
指令中:
// Non-C includes
#include <iostream>
extern "C"
{
#include <freetype/freetype.h>
// ... Other freetype includes
}
你或许可以在extern "C"
指令中使用#import
代替#include
。我从来没有尝试过,但我不明白为什么它不起作用。
很高兴知道。这解决了我对于SFMT的正确问题,但是Freetype仍然在抱怨,所以二进制或链接可能有问题,我将不得不更多地研究它。感谢您的快速回复! – user1137704 2012-02-12 08:01:35
用这个包围你的c头文件。这也可以围绕包括:
#ifdef __cplusplus
extern "C" {
#endif
// function declarations etc if this is your own header.
// OR you can use this in the .mm file to surround your include.
//...
#ifdef __cplusplus
};
#endif
这指定您的c函数的外部链接。 如果在包含c .h文件时不这样做,C++编译器将以与C编译器不同的方式进行破解,并导致链接器出现问题。
通过使用extern "C"
,您告诉您的C++编译器使用C风格的函数调整。
这将不得不为OP要包含的每个Freetype头完成。当更新第三方库时会导致维护头痛。 – 2012-02-12 07:45:08
好点 - 我第一次错过OP是包含第三方lib。如果是他自己的代码,他可能更喜欢在标题中使用链接规范(因此他不必在每个包含中都这样做)。我修改了我的答案以包含您的建议。 – 2012-02-12 07:49:54
你是如何为Freetype生成二进制文件的?我相信你已经知道这一点,但你不能只为一个桌面平台编译libfreetype.a。 – 2012-02-12 08:09:50
按照本教程,我构建了所有4种体系结构的二进制文件,并将它们组合到了freetype.a中。我要再试一次,因为我在iOS模拟器中运行的是同样的错误。所以这不仅仅是我错过了arm6/7。 – user1137704 2012-02-12 18:20:43
您忘了将链接发布到教程。在使用第三方库时,我使用这里描述的方法(http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/)。我用这种方法得到的唯一问题是,当我更改库中的某些东西时,应用程序不会与更新后的库重新链接,除非我先执行Clean。 – 2012-02-12 18:40:03