【问题标题】:Xcode c/c++ undefined symbolsXcode c/c++ 未定义符号
【发布时间】:2018-04-27 15:44:40
【问题描述】:

我有一个 .cpp 文件,我声明了一个函数

#ifndef MyFile_hpp
#define MyFile_hpp

#ifdef __cplusplus
extern "C" {
#endif

void runCode();

#ifdef __cplusplus
}
#endif

#endif 

这很好用。我可以在我的 Objc 中调用这个函数。在我的实现中,我有一个 extern void,它不会让我打电话。它给出了未定义的符号。我需要按原样构建,extern 将在编译时在不同的文件中声明。有了 extern,这个编译器是否应该信任我并让我构建?

#include "MyFile.h"

extern int runMe();

#ifdef __cplusplus
extern "C" {
#endif

void runCode() {
   runMe();
}

#ifdef __cplusplus
}
 #endif

【问题讨论】:

  • 第一个显示的代码是 .cpp 文件(如问题正文中所述)、名为“MyFile.hpp”的标头(如重新包含保护所暗示的)或名为“MyFile.h”的标头"(包含行中使用的名称)?
  • 第一个文件名为 MyFile.h,第二个文件名为 MyFile.cpp
  • 你能给出函数runMe();的定义吗?我在引用的代码中没有看到它。我觉得编译器/链接器。
  • 显示的代码是由 C++ 编译器还是 C 编译器编译的? extern是C++编译器编译的还是C编译器编译的?
  • 如果将runMe() 的声明移到外部“C”中会发生什么?

标签: c++ objective-c xcode extern


【解决方案1】:

我认为你所做的可能是正确的。

编译器不仅仅信任你。使用附加字符或“装饰”向链接器声明 C++ 函数,这些字符或“装饰”定义了它所属的 cclass 及其所有参数的完整细节。 C 函数没有这些,只有原始名称,因此链接器很容易区分。

【讨论】:

  • 在 .cpp 中调用 extern 会给出架构 arm64 的未定义符号:
  • 它说什么符号未定义?
  • 架构 arm64 的未定义符号:“runMe()”,引用自:MyFile.o ld 中的 _runCode:未找到架构 arm64 的符号 clang:错误:链接器命令失败,退出代码为 1 (使用 -v 查看调用)
  • 所以你必须将你的c++函数runMe写在另一个.cpp文件中?
  • 我将把runMe函数写在一个尚未创建的C文件中
猜你喜欢
  • 2015-09-19
  • 2016-03-25
  • 2012-09-05
  • 1970-01-01
  • 2015-03-01
  • 2012-07-17
  • 1970-01-01
  • 2014-06-01
  • 2011-11-19
相关资源
最近更新 更多