2

可怕的典型链接器错误..

ld:未找到架构 armv6 的符号 collect2:ld 返回 1 个退出状态

但是,它是由文件名引起的吗?我使用 C++/Objective-C,所以我所有的 Obj-C 文件都是 .mm,但我永远不能使用任何 .c 文件。例如,我在我的项目中包含了 SFMT 算法,这给了我这些错误,但是只需将单个 .c 文件更改为 .cpp 就可以让它消失并且代码工作得很好!我只包括标题,所以我不确定为什么这会有所不同。

现在的问题是我正在尝试包含 Freetype2,给了我同样的问题(很确定这是因为它是 .c),但它太大而无法重命名每个文件,而且我也在使用链接的二进制文件,所以除非我用新的文件名重新编译它,我不能改变它。所以现在是时候找出这背后的真正原因了。

知道为什么会发生这种情况吗?如何停止 .c 文件的链接器错误?

4

2 回答 2

0

用这个包围你的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 编译器的方式进行处理,并导致链接器出现问题。
通过 using extern "C",您是在告诉您的 C++ 编译器使用 C 风格的函数重整。

于 2012-02-12T07:36:16.610 回答
0

将您的 Freetype 包含在extern "C"指令中:

// Non-C includes
#include <iostream>

extern "C"
{
    #include <freetype/freetype.h>
    // ... Other freetype includes
}

您可能可以在指令中使用#import而不是。我从未尝试过,但我不明白为什么它不起作用。#includeextern "C"

于 2012-02-12T07:38:34.960 回答