1

我有一个静态库 X,它位于 C 中。我有另一个静态库 Y,它位于目标 C 中,它的 .mm 文件引用库 X 的函数。现在在一个单一视图应用程序中,我使用了库 Y。但是在编译它的过程中给出一个错误说

Undefined symbols for architecture i386:
  "encode()", referenced from:
      _playMediaInternal in libXMedia.a(XMediaInternal.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

上述编码函数存在于库 X 中,库 Y 正在使用该函数,并且单视图应用程序使用该函数。有什么建议么 ?我已经看到了同一行的其他查询,但没有运气。另一个线程链接

在 Apple 开发者网站上,我一直在尝试使用静态库链接

我已将手机连接到笔记本电脑并开始对其进行编译。它仍然给我错误。现在我觉得它与链接自身而不是架构有关

4

2 回答 2

5

我从 stackoverflow 链接中得到了答案

我正在粘贴确切的东西。对我来说,问题在于具有基于 C 的函数调用的标头

如果您在 c++ 文件中使用 c 函数。你应该使用extern "c"{}. 在 .h 文件中

#ifdef __cplusplus
extern "C" {
#endif

swrve_currency_given(parameter1, parameter2, parameter3);// a c function


#ifdef __cplusplus
}
#endif  

extern "C" 旨在被 C++ 编译器识别并通知编译器所指出的函数是(或将)以 C 风格编译的。

如果您要链接到编译为 C 代码的库。利用

extern "C" {
  #include "c_only_header.h"
}

看看何时在 C++ 中使用 extern "C"?

于 2013-04-13T22:36:33.170 回答
0

您的库为 ARM 架构编译,您尝试在模拟器(i386 架构)中运行应用程序。你的库必须是支持 arm 和 i386 的胖库。使用lipo工具,您可以从 arm 和 i386 版本制作 fat 库。里德在这里:

http://mark.aufflick.com/blog/2010/11/19/making-a-fat-static-library-for-ios-device-and-simulator

于 2013-04-13T09:02:38.940 回答