python c-Erweiterung, Probleme mit dlopen auf Mac OS

9

Ich habe eine Bibliothek genommen, die als binäre Bibliothek (.a) und Header verteilt ist, etwas C ++ Code dagegen geschrieben hat und die Ergebnisse in ein Python-Modul einbinden will.

Ich habe das hier gemacht.

Das Problem ist, dass beim Importieren dieses Moduls unter Mac OSX (ich habe 10.5 und 10.6 versucht), der folgende Fehler angezeigt wird:

%Vor%

Das sieht so aus, als ob die im Carbon-Framework definierten Symbole nicht korrekt aufgelöst werden, aber ich bin nicht sicher, was ich dagegen tun soll. Ich liefere -framework Carbon auf distutil.core.Extension 's extra_link_args Parameter, also bin ich mir nicht sicher was ich sonst tun sollte.

Jede Hilfe wäre sehr willkommen.

Aktualisierung:

Die von setup.py generierte Kompilierzeile sieht folgendermaßen aus:

%Vor%

Die Linker-Zeile sieht so aus:

%Vor%

otool meldet:

%Vor%

Update 2 : Unter MacOS 10.5 löst das Ändern der dlopen-Flags vom Standardwert RTLD_NOW auf RTLD_LAZY das Problem. Dies funktioniert jedoch nicht unter Mac OS 10.6.

In 10.6 ermöglicht die folgende Sequenz die ordnungsgemäße Ausführung der Bibliothek, obwohl ich mir nicht sicher bin, warum:

  1. python setup.py build -v
  2. Führen Sie die Linker-Zeile (die von setup.py an die Konsole ausgegeben wird) erneut manuell aus.
  3. python setup.py installieren

Ich bin immer noch auf der Suche nach einer guten Antwort darauf, wie dies funktioniert. Danke!

    
Jason Sundram 07.05.2010, 16:46
quelle

1 Antwort

4
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123linker ___ Der Linker ist Teil der Toolchain zum Erzeugen von ausführbaren Dateien aus Quellcode, der in kompilierten Programmiersprachen geschrieben wurde. Sie benötigt kompilierten Objektcode in mehreren Dateien und erzeugt daraus eine einzelne, "verknüpfte", ausführbare Datei. ___ qstnhdr ___ python c-Erweiterung, Probleme mit dlopen auf Mac OS ___ answer2905495 ​​___

Du wirst dich selbst treten, wenn du die Antwort darauf siehst! Versuchen Sie, dies zu ändern:

%Vor%

dazu:

%Vor%

Nachdem ich diese Änderung vorgenommen hatte, war ich in der Lage, einen sauberen Build zu erstellen und das Modul sofort zu importieren:)

    
___ qstntxt ___

Ich habe eine Bibliothek genommen, die als binäre Bibliothek (.a) und Header verteilt ist, etwas C ++ Code dagegen geschrieben hat und die Ergebnisse in ein Python-Modul einbinden will.

Ich habe das hier gemacht.

Das Problem ist, dass beim Importieren dieses Moduls unter Mac OSX (ich habe 10.5 und 10.6 versucht), der folgende Fehler angezeigt wird:

%Vor%

Das sieht so aus, als ob die im Carbon-Framework definierten Symbole nicht korrekt aufgelöst werden, aber ich bin nicht sicher, was ich dagegen tun soll. Ich liefere %code% auf %code% 's %code% Parameter, also bin ich mir nicht sicher was ich sonst tun sollte.

Jede Hilfe wäre sehr willkommen.

Aktualisierung:

Die von setup.py generierte Kompilierzeile sieht folgendermaßen aus:

%Vor%

Die Linker-Zeile sieht so aus:

%Vor%

%code% meldet:

%Vor%

Update 2 : Unter MacOS 10.5 löst das Ändern der dlopen-Flags vom Standardwert %code% auf %code% das Problem. Dies funktioniert jedoch nicht unter Mac OS 10.6.

In 10.6 ermöglicht die folgende Sequenz die ordnungsgemäße Ausführung der Bibliothek, obwohl ich mir nicht sicher bin, warum:

  1. python setup.py build -v
  2. Führen Sie die Linker-Zeile (die von setup.py an die Konsole ausgegeben wird) erneut manuell aus.
  3. python setup.py installieren

Ich bin immer noch auf der Suche nach einer guten Antwort darauf, wie dies funktioniert. Danke!

    
___ tag123setuppy ___ setup.py ist ein Python-Skript, das von Bibliotheken benötigt wird, die mit Distutils verpackt und verteilt werden. ___ tag123dlopen ___ POSIX-Funktion zum dynamischen Laden einer Bibliothek oder Binärdatei in den Speicher ___ tag123pythoncextension ___ API, die von C- und C ++ - Programmierern verwendet wird, die Erweiterungsmodule schreiben oder Python einbetten möchten. ___
jkp 25.05.2010, 14:18
quelle