链接器命令失败,退出代码1(使用-v查看调用)iOS错误

时间:2017-05-23 08:00:05

标签: ios objective-c linker-errors

在我的应用程序中,我在名为ABC.a的c文件中使用该库中名为Layout.c的静态库,有一个名为init()的函数。我将库链接到项目并添加了.h文件。程序编译时没有错误,但在链接函数时抛出错误。为什么呢?

信息:我在构建阶段也添加了静态库。

该库是为armv7,armv7s和arm64构建的。 bitcode已启用:否和构建活动体系结构:否

示例错误:

Undefined symbols for architecture arm64:
  "AMID_INIT(int*, int*, int)", referenced from:
      -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o
  "amid_Val(float const*, int, int*, int, unsigned int)", referenced from:
      -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o

请为此两天帮忙。

1 个答案:

答案 0 :(得分:2)

这是基于您提到.a文件是从c文件生成的事实。链接器错误:

  "AMID_INIT(int*, int*, int)", referenced from:
      -[ViewController microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:] in Test_lto.o

表示AMID_INIT定义来自C ++ / Objective-C ++文件 - 这是因为C文件没有关于例程参数的信息。

由此我可以推测库头文件没有c ++防护。

在这种情况下有三种方法 - 用C ++代码包装所有库头文件的导入:

extern "C" {
#import "lib.h"
}

或创建一个lib.hpp文件,其中包含:

#pragma once
extern "C" {
#import "lib.h"
}
取而代之的是

#import 'lib.hpp',或者通过添加标准名称修复预防来修复lib.h文件:

...靠近lib.h的开头:

#ifdef __cplusplus
extern "C" {
#endif

...靠近lib.h的末尾:

#ifdef __cplusplus
}
#endif

通过声明lib.h提供的所有例程都使用C公开,您可以继续对C++lib.h编译器使用C联系,而不是C++联系。