2009-08-05 14 views
8

Grafik işleme ve ağ iletişimi için ön uç için Objective-C ve C++ kullanarak bir grafik uygulama yazıyorum. Apple'ın sitesinde, X ++ projemde bir .dylib veya .so'u bağlantı kurabilmenin bir yolunu arıyorum, ancak hiçbir şey işe yaramadı. Projeyi referans gösterip ona karşı bağlantı kurabildim, ancak .dylib'den işlevleri çağırmaya çalıştığımda, ne yapmaya çalıştığımı bilmediğini söylüyordu. Burada neler olduğunu bilen var mı?Bir C++ kütüphanesi ile bir Objective-C uygulaması arasında bağlantı kurma ve kullanma

Objective-C'nin grafik ve ağ oluşturmaya ihtiyaç duyduğum tüm kitaplıklara sahip olduğunu biliyorum, ancak bunu böyle yapmak gibi hissediyorum. Bir süredir fazla C++ yapmamıştım ve daha fazla Objective-C öğrenmek istiyorum, bu yüzden onları birlikte kullanmaktan daha iyi bir yol var mı?

sayesinde Robbie

cevap

13

Sen "adı bozma" denen şeklinde bir engel vurmak için gidiyoruz. C++, işlev adlarını Obj-C ile uyumlu olmayan bir şekilde saklar.

Amaç-C, C++ ile aynı şekilde sınıfları uygulamamaktadır, bu yüzden beğenmeyecektir.

Bunun bir yolu, C++ işlevlerini çağıran bir dizi basit C işlevi uygulamaktır. C işlevlerinin sayısını mümkün olduğunca düşük tutmak iyi bir zorluk olacaktır! Son derece güzel bir arayüzle son bulacaksın! :)

bir C++ dosyasında bu işlevleri bildirmek için, birlikte C olarak işaretlemek gerekir:

extern "C" int function_name(char *blob,int number, double foo) {...} 

Bu standard isim bozma devre dışı bırakır.

Hedef C kodunuzla paylaşabileceğiniz tüm bu işlevlerin prototiplerini içeren bir üstbilgi dosyası oluşturun.

Aynı şekilde sınıflar arasında geçiş yapamazsınız (ObjC kodunuz bunları kullanamadığı için), ancak işaretçileri geçirebilirsiniz (ancak türler hakkında yalan söylemeniz gerekebilir. biraz).

+6

Başka bir seçenek, Objective-C dosyaları Objective-C++ dosyalarınızı .mm uzantılarını değiştirerek yapmak ve sonra C++ ve Objective-C kodlarını karıştırarak yapmaktır. – Amok

+0

Bu benim için çalıştı. Bir .mm' dosyasında bir sınıf oluşturdum ve C++ kütüphanelerine mükemmel bir şekilde bağlantı kurabildim ve .'m' dosyalarımdan sarmalayıcı yöntemlerini çağırdım. Teşekkürler! –

13

Üzerinde çalıştığım çoğu projenin bir ObjC ön ve C++ arka ucu var. Sadece işlevlerle uğraşıyorsanız, Dave Gamble'ın ad mangle düzeltme doğrudur, ancak hem ObjC hem de C++ nesneleriyle uğraşmanız gereken daha karmaşık durumlarla uğraşıyorsanız, en iyi seçiminiz C++ nesnelerini sarmaktır. ObjC nesnelerinde. Opak referansları kullanarak (void*'un çok süslü bir şeklidir), ObjC'de C++ nesnelerini el ile gerçekleştirebilirsiniz. Yararlı olabilecek bazı sample code var.

Grafikler için, Core Image ve ilgili çerçeveler kullanmak yerine, özel C++ yapmanın muhtemelen ciddi bir performans göstereceğini tahmin edersiniz. Çekirdek Görüntü ve diğer grafik çerçeveleri Mac için çok iyi bir şekilde optimize edilmiştir ve elle işlenmiş C++ (veya özellikle Mac için olmayan çok iyi yazılmış C++) ile daha iyi performans göstermeniz mümkün değildir. 10.6'ya ve büyük merkezi dağıtıma geçtiğinizde, performans farkı daha da belirgin hale gelecektir çünkü aksi takdirde ücretsiz olarak alacağınız tüm paralelleştirme avanslarını kaybedersiniz. Bunun ObjC ile hiçbir ilgisi yok; Çekirdek Resim C'dir. C++ 'dan istediğiniz her şeyi arayabilirsiniz. Taşınabilirliğe ihtiyacınız yoksa veya Çekirdek Görüntüyü yenmek için gereken uzmanlığa sahip olmadığınız sürece Mac'te herhangi bir dilde özel grafik işlemeye karşı öneriyorum.

+0

Merhaba, Sunulan örnekte, C++ nesnesini Objective-C++ (.mm dosya uzantısına) ve Objective-C (.m dosya uzantısı) içine sarma olduğunu görebilirsiniz. Anladığım kadarıyla bir Objective-C nesnesine sahip olamazsınız ** A **, Objective-C++ object ** B ** paketini kullanır. Her bir '.m' dosyasının uzantısını '.mm' olarak değiştirmeniz gerekir. Böylece projenizi Objective-C++ yapmak zorundasınız! – MichK

+2

Bu doğru değil. "B.h" saf ObjC olduğu sürece (C++ 'yı bildirmez), kesinlikle "A" dan "B" yi çağırabilirsiniz. Her ".m" yi ".mm" olarak değiştirmenize gerek yoktur (ve yapmamalısınız). –

İlgili konular