我第一次尝试创建一个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.c
和b.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
的东西是如何工作的。