2016-04-07 32 views
2

C++'da bir Python uzantısı yazıyorum. Öyle gibi benim setup.py dosyada kurucu kaynak dosyalarının bir listesini tanımlayarak bunu derlemek: Distutils: C++ uzantısının bir parçası olarak bir Objective-C++ kaynak dosyasını derlemek

extensions = { 
    'im': [ 
     "im/src/buffer.cpp", 
     "im/src/detail.cpp", 
     "im/src/gil.cpp", 
     "im/src/halideimage.cpp", 
     "im/src/hybrid.cpp", 
     "im/src/hybridimage.cpp", 
     "im/src/options.cpp", 
     "im/src/pybuffer.cpp", 
     "im/src/pycapsule.cpp", 
     "im/src/structcode.cpp", 
     "im/src/typecode.cpp", 
     "im/src/module.cpp" 
    ], 
} 

... Bunlar sonuçta setup() işleve setuptools.Extension bir örneğini tanımlamak için kullanılır. Bu bir platforma özgü parça eklemek çalıştığında tüm şimdi, kadar, proje boyunca sadece iyi çalıştı vardır: Bu yeni bit derleme için doğru dosyayı seçer ekleyerek ...

preview_source = (sys.platform == 'darwin') and 'im/src/plat/preview_mac.mm' or \ 
        (sys.platform == 'linux') and 'im/src/plat/preview_linux.cpp' or \ 
        (sys.platform == 'win32') and 'im/src/plat/preview_windows.cpp' or \ 
               'im/src/plat/preview.cpp' 

extensions = { 
    'im': [ 
     "im/src/buffer.cpp", 
     "im/src/detail.cpp", 
     "im/src/gil.cpp", 
     "im/src/halideimage.cpp", 
     "im/src/hybrid.cpp", 
     "im/src/hybridimage.cpp", 
     "im/src/options.cpp", 
     preview_source, 
     "im/src/pybuffer.cpp", 
     "im/src/pycapsule.cpp", 
     "im/src/structcode.cpp", 
     "im/src/typecode.cpp", 
     "im/src/module.cpp" 
    ], 
} 

- ama hiç derlenmeyecektir o distutils bir gelince hiçbir uzman değilim

unknown file type '.mm'

error: unknown file type '.mm'

: Mac OS X'te Görünüşe distutils/setuptools bir kaynak dosyası olarak “mm” uzantısı tanımıyor 12 setuptools platforma özel yapılandırma - Bu tek kaynak dosyayı Mac'teki kaynak dosya listesine eklemenin basit bir yolu nedir?

cevap

2

Aynı konuyla karşılaştım, bir çözüm buldunuz mu?

'.mm', distutils sürümümde desteklenmiyor ama '.m' isminde. Bu yüzden .mm dosyasının C++ bölümlerini bir .cpp dosyasına ayırdım ve .c dosyasını .cpp dosyasından erişmek için küçük bir C başlığı oluşturdum.

+0

Yaptığım şey ".m" dosyalarının yeniden adlandırılmasıydı ve daha sonra "-x objektif-C++" derleyicinin arşivlerine ekleniyordu - taşınabilir olan bir çözüm (Bence - x' sadece clang-only bir şeydir) ya da uygun değildir (dosyalar esas olarak yanlış adlandırılır). Çözümünüz daha temiz, ama aynı zamanda uzun vadede aynı derecede hoş olmayan bir ses çıkarır… Aslında, problem için gerçek bir çözüm bulmaya devam ediyorum. – fish2000

+1

Bana döndüğün için teşekkürler. .m dosyalarını kullanma sorunu nedir, sadece iyi çalışıyor gibi görünüyor. Şüphelerin halledemediği uzun bir hata gibi görünüyor. 2001'den bir hata raporu + yama (16 yıl önce !!!) buldum: https://mail.python.org/pipermail/distutils-sig/2001-December/002695.html –

+0

Kullanmak zorunda olmanın bir problemi ".m", uygulamanın, Objective-C++ ile birleştirildiği durumlarda - ve bunu yapabildiğiniz gibi - dil ile çeviri birimlerine kolayca dağıtılamaz - Winterfell ile iyi oynamamayan bir tür fahişeyle Xcode veya cmake, vb. Gerçekte, sizin de belirttiğiniz gibi, dünyanın sonu - programcılarının OKB'sini etkilemenin bir sorundur; dosya eki sadece bir referans noktası iken, bir dosya için sahip olduğunuz en güvenilir metadattır. Ama yine de: 16 yıllık böcek, ne? – fish2000

İlgili konular