Ich schreibe eine Python-Erweiterung in C++. Ich kompilieren es durch eine Liste der konstituierenden Quelldateien in meiner setup.py
Datei definieren, etwa so:Distutils: Kompilieren einer Objective-C++ - Quelldatei als Teil einer C++ - Erweiterung
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"
],
}
... diese verwendet werden, um eine Instanz von setuptools.Extension
zu definieren, die letztlich zur setup()
Funktion übergeben wird. Dies hat alle während des gesamten Projekts ganz gut gearbeitet, bis jetzt, als ich versuchte, eine plattformspezifische Bit hinzuzufügen:
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"
],
}
... Hinzufügen dieser neuen Bit die richtige Datei für die Kompilierung wählt - aber es funktioniert nicht überhaupt kompilieren
error: unknown file type '.mm'
ich bin kein Experte, wenn es um distutils
kommt ein: Offenbar distutils
/setuptools
nicht die „.mm“ Erweiterung als Quelldatei erkennen auf Mac OS X. nd setuptools
plattformspezifische Konfiguration - Was ist eine einfache Möglichkeit, diese eine Quelldatei bedingt der Quelldateiliste auf dem Mac hinzuzufügen?
Die Sache, die ich am Ende getan habe, war das Umbenennen '.mm' von Dateien in' .m' Dateien und dann '-x objective-C++' zu den Compilerargs - eine Lösung, die weder portierbar ist (ich denke '- x 'ist ein nur-drang-nur-Ding) noch zugänglich (in Anbetracht der Dateien sind im Wesentlichen jetzt falsch benannt). Ihre Lösung klingt sauberer, aber auf lange Sicht auch nicht mehr ... Ich suche immer noch eine echte Lösung für das Problem. – fish2000
Danke für die Rückmeldung an mich. Was ist das Problem der Verwendung von .m-Dateien, scheint es gut zu funktionieren. Es scheint ein langer ausstehender Fehler zu sein, dass distutils nicht mit .mm umgehen kann. Ich habe einen Fehlerbericht + Patch von 2001 (vor 16 Jahren !!!) darüber gefunden: https://mail.python.org/pipermail/distutils-sig/2001-December/002695.html –
Ein Problem mit der Benutzung '.m' ist das, in Fällen, in denen die Implementation an der Spitze von Objective-C++ steht - und als solche nicht ohne Weiteres in Übersetzungseinheiten nach Sprache zerlegt werden kann, wie Sie es konnten - enden Sie mit einer Bastard-von-Winterfell Art von Datei, die nicht schön mit zB spielt Xcode oder cmake, etc. In Wirklichkeit ist es nicht, wie du bemerkst, das Ende der Welt - es ist die Art von Problem, das die OCD meines Programmierers jedoch entflammt; Während das Dateisuffix nur ein Datum ist, bleibt es das zuverlässigste Metadatum, das Sie für eine Datei haben, und so. Aber trotzdem: 16-jähriger Bug, was? – fish2000