2017-05-23 18 views
0

私のアプリケーションではという名前のCファイルにそのライブラリのABC.aという静的ライブラリを使用しています。init()という関数があります。ライブラリをプロジェクトにリンクして.hファイルを追加しました。プログラムはエラーなしでコンパイルされますが、関数をリンクするとエラーがスローされます。どうして?リンカーコマンドが終了コード1で失敗しました(呼び出しを見るために-vを使用してください)iOSエラー

Info:スタティックライブラリもビルド段階で追加しました。

また、ライブラリはarmv7、armv7s、およびarm64用に構築されています。ビットコード有効:いいえ、アクティブアーキテクチャビルド:NO

例エラー:

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 

は、このために行って2日間を助けてください。

+1

ライブラリのヘッダーにはC++ガードがなく、目的のC++プログラムで使用しています。 'extern" C "{\ n#import 'lib.h' \ n}'に '#import 'lib.h''をラップして、それが役立つかどうかを調べてください。 – Petesh

+0

これを試してください:あなたのアーキテクチャーと有効なアーキテクチャーが大丈夫ならば、他のリンカー・フラグに$(継承)を追加しているかどうかをチェックすることができます。 – KKRocks

+0

@Peteshコメントは間違いありません。素晴らしい男。あなたは多くの時間を節約しました。ありがとう。私はそれを確認する答えを入れてください。 –

答えて

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++ガードがなかったと推測できました。この場合

3つのアプローチ - のようなものでC++コードのライブラリのヘッダファイルのすべての輸入をラップ:含む、

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

またはlib.hppファイルを作成します。

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

#import 'lib.hpp'を代わりにlib.hファイルに標準名のmangling preventativeを追加して修正してください。

... lib.hのT:lib.hの

#ifdef __cplusplus 
extern "C" { 
#endif 

...近端:

#ifdef __cplusplus 
} 
#endif 

これは、あなたがすべてのルーチンは、によって提供されることを宣言することでCC++コンパイラの両方でlib.hを使用して維持することができますlib.hは、C++リンケージではなく、Cリンケージを使用して公開されています。

関連する問題