Apple Mach-O 链接器 (Id) 错误 1 - 带有头文件的基本C++



我第一次尝试创建一个Xcode项目(我使用的是C和C++,没有Obj-C(。

这是项目的结构:

项目

主.cpp

A.H
B.H

来源


交流电 不列颠哥伦比亚省

示例内容:

啊:

void some_fun();

BH:

#include "a.h"

主.cpp:

#include "b.h"
int main(){
    some_fun();
}

在编译源代码中,包括main.cpp,a.c和b.c。
当我尝试构建它时,每次调用some_fun()都会出现一个错误,然后又出现一个错误。

错误是:

Apple Mach-O 链接器 (ID( 错误
--"some_fun(("引用自:
--_main in main.o

Apple Mach-O 链接器 (ID( 错误 --链接器命令失败,退出代码为 1

我在 XCode 配置中遗漏了什么吗?
main.cpp中使用 a.h 的函数而不显式包含它是否有问题?
还是由于某种原因,我的结构从根本上是错误的(不过我能够通过命令行构建它(?

基本问题是您没有将a.cb.c中公开的函数标记为C代码,而不是C++代码。 C++使用一种称为名称重整的原则,以标识函数以进行重载等的形式公开函数。

当您编译a.c文件时,它生成了一个不包含任何名称重整的.o文件,因为它C

现在,当您在C++文件中使用代码(通过间接#include(时,由于您没有向C++编译器暗示将在包含C公开例程而不是C++公开例程的.o中找到例程,因此链接器将无法建立连接。

解决方案很简单,您必须在.h文件中使用标记将这些命中提供给C++编译器。这通常是通过将所有公开的符号包装在如下所示的代码中来完成的:

#ifdef __cplusplus
extern "C" {
#endif
void some_fun();
#ifdef __cplusplus
}
#endif

你几乎把extern "C"块放在文件的开头,在包含保护内(你有一个包含保护吗?还有[另一个SO问题]解释了#ifdef __cplusplus的东西是如何工作的。

最新更新