gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:31 25 4
gpt4 key购买 nike

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

这是项目的结构:

project

main.cpp

标题

a.h
b.h

来源

a.c
b.c

示例内容:

嗯:

void some_fun();

b.h:

#include "a.h"

主要.cpp:

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

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

错误是:

Apple Mach-O Linker (Id) Error
--"some_fun()" referenced from :
--_main in main.o

Apple Mach-O Linker (Id) Error --Linker command failed with exit code 1

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

最佳答案

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

当您编译 a.c 文件时,它会生成一个 .o 文件,该文件不包含任何名称修改,因为它是 C

现在,当您在 C++ 文件中使用代码时(通过间接 #include),因为您没有提示 C++ > 编译器将在包含 C 暴露例程的 .o 文件中找到例程,而不是 C++ 暴露例程,链接器不会能够建立连接。

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

#ifdef __cplusplus
extern "C" {
#endif

void some_fun();

#ifdef __cplusplus
}
#endif

你几乎把 extern "C" 放在文件的开头,在 include guard 里面(你确实有一个包含守卫?)。有 [another SO question] 解释了 #ifdef __cplusplus 的工作原理。

关于c++ - Apple Mach-O 链接器 (Id) 错误 1 ​​- 带头文件的基本 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27388602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com