2017-05-23 72 views
0

在我的應用程序中,我在名爲Layout.c的c文件中使用名爲ABC.a的靜態庫,該函數有一個名爲init()的函數。我將庫鏈接到項目並添加了.h文件。該程序編譯時沒有錯誤,但在鏈接函數時拋出錯誤。爲什麼?鏈接器命令失敗,退出代碼1(使用-v查看調用)iOS錯誤

信息:我已經在構建階段添加了靜態庫。

該庫是爲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++警衛,而是在一個Objective-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++的警衛。

在這種情況下

三種方法 - 包裹在C++代碼庫的頭文件的所有進口的東西,如:

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

或創建lib.hpp文件,其中包含:

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

#import 'lib.hpp'相反,或修復lib.h文件通過添加標準名稱mangling預防:

...近星lib.h的T:

#ifdef __cplusplus 
extern "C" { 
#endif 

... lib.h的近端:通過聲明,所有的程序所提供

#ifdef __cplusplus 
} 
#endif 

這允許您使用lib.hCC++編譯器,以保持lib.h都是使用C聯動,而不是C++聯動。

相關問題