2

我已經看到很多關於如何將Objective-C應用程序鏈接到C++庫的信息,但是你可以用其他方法做到嗎?您可以將C++ Linux針對的應用程序鏈接到Objective-C靜態庫嗎?

我的合作伙伴和我一直在使用Objective-C開發iPhone應用程序。通過該項目的一半,我們決定添加一個新功能。此功能將需要推送通知,因此我們需要編寫將在Linux機器上運行的服務器端應用程序。此服務器應用程序需要訪問Objective-C中編寫的代碼(大部分,實際上)。我想我們有兩個選擇:用C/C++重寫所有的東西,或者重新編譯Linux上的Objective-C代碼。由於重寫時間太長,我想採取第二條路線。

我設法使用GCC和GNUstep將我們需要的用於linux服務器應用程序的Objective-C類編譯成靜態庫。我想用C++編寫實際的服務器應用程序,但我需要將該應用程序鏈接到Objective-C庫。可以做到嗎?怎麼樣?

如果沒有,任何人都可以給我一個如何去做這個想法?

+0

我想你基本上需要將調用放入'.m'文件並調用你在那裏定義的任何c函數? –

+0

@ MichaelKrelin-hacker也許你的意思是'.mm'?無論哪種方式,你所說的是,我的所有服務器端Linux應用程序的源文件都必須由GCC Objective-C前端編譯?我不能命名我的文件'something.cpp'並將它們鏈接到Objective-C庫('-lMyObjCLib')? –

+0

'.m'應該這樣做。不,我認爲你可以從'.c'或'.cc'(或'.cpp')文件的'.m'文件中調用''''函數。這只是接口部分應該是'.m'。 –

回答

2

Linux機器上的Gcc應該能夠編譯Objective-C以及標準基礎類,例如NSStringNSArray。您可能需要將apt-get的前端轉至gcc。或者甚至更好地使用LLVM。

只要您不在共享代碼中使用Apple庫,您應該可以在Linux上進行編譯。

如果您想從C或C++應用程序中調用它們,您必須將您的Objective-C功能包裝到C函數中。我在回答這個SO問題時提供了一些指導:is there any way to use Objective-C library in C?

編輯(回答評論的問題)

包裝函數必須的.m文件,並與Objective-C的編譯器和編譯,因爲它仍包含Objective-C代碼只是揭示明碼.C功能。它與相同C API C++代碼包裝仍然需要C++代碼 - 只需要定義extern "C"函數。在Objective-C,你需要沒有extern "C"作爲Objective-C的仍然是Ç - 同樣的聯動等

您可以使用簡單的-l標誌得到圖書館的兼容GCC編譯器。

通過蘋果庫,我的意思是超過NSFoundation.h - 特定的iPhone庫 - 如CocoaTouch

NSFoundation.h肯定是由您的Objective-C包/ GNUStep提供的。

+0

謝謝,這似乎確實是我需要的。但我想我需要更多的細節。包含包裝函數實現的源文件必須是**。m **,對吧?並由GCC/Linux作爲Objective-C靜態庫進行編譯?那麼我的C/C++應用程序如何鏈接到那個庫?普通的'-l'鏈接器選項?另外,「Apple庫」的意思是** Foundation.h **等等?再次感謝你,我有點失落,但我開始明白這是如何完成的。 –

+0

@DaniloCarvalho - 剛剛更新我的答案,以反映你的問題。如果你喜歡它,不要忘記注意並接受答案。 – Krizz

+0

太棒了!我會嘗試的,對我很有意義,所以它應該工作。非常感謝。 –

相關問題