在我的应用程序中,我在名为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
请为此两天帮忙。
答案 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++
联系。