ich es geschafft haben, eine statische CPython Bibliothek unter Windows 10, indem mit dem Projekt hier als Basis (um Visual C++ 2008 gebaut) aufbauen Mit den vorgeschriebenen Anweisungen konnte ich die Bibliothek in VS2015 erstellen, indem ich die unten aufgeführten Problemumgehungen ausfindig machte.Gebäude CPython statisch auf Windows Verknüpfung Probleme
Sobald die Bibliothek gebaut wurde, habe ich über das Kompilieren und Verknüpfen das Beispiel c Quelle geliefert, aber bald diesen Code auf den folgenden Test reduziert:
#include <stdio.h>
#include <Python.h>
int main()
{
Py_Initialize();
return 0;
}
ich das Bit in pyconfig.h entfernen musste die tut dies:
pragma comment(lib,"python27.lib")
so dass es nach den Symbolen in meinem statischen lib suchen würde.
Diese nicht kompiliert, da der Linker klagt:
Source.obj : error LNK2001: unresolved external symbol __imp__Py_Initialize
ich den Weg auf die erzeugte statische Bibliothek, pythonembed.lib hinzugefügt haben, in:
Properties->Linker->General->Additional Library Directories
Dies ist eingestellt auf:
/workspace/superstatic-python/Python-2.7.3/PCbuild
Ich habe auch die Bibliothek angegeben in (versuchte sowohl blanke Name und absolute pat h):
Properties->Linker->Input->Additional Dependencies
Dies ist eingestellt auf:
pythonembed.lib
Ausführen des Befehls:
dumpbin.exe /all pythonembed.lib
zeigt, dass es ein Symbol _Py_Initialize benannt ist. Ich habe überprüft, dass sowohl die statische Bibliothek als auch das Testprojekt mit dem v140-Toolset als Releasebuild für 32 Bit erstellt wurden.
Habe ich irgendwelche Schritte verpasst, VC++ korrekt zu verknüpfen?
Das interessante Bit ist, dass der Code Py_Initialise aufruft, sucht der Linker nach __imp__Py_Initialize, aber die statische Bibliothek hat das Symbol: _Py_Initialize.
Zeigt dies auf die Lösung?
Probleme zu lösen, die statische Bibliothek unter Windows 10 mit VS2015 zu bauen:
GNU Patch-
GNU Patch für mich nicht funktioniert. Es löst UAC und lädt in einer neuen Konsole und tut nichts. Scheint, dieses Verhalten auszulösen, weil es "patch.exe" genannt wird. Ich habe verschiedene Umgehungen dafür gefunden, aber stattdessen habe ich Cygwins Patch benutzt und den Cygwin Bin-Ordner in den Pfad eingefügt.
Weder Versionen von 7zip heruntergeladen kamen mit einem 7za.exe, so war es notwendig, 7z.exe umbenennen
NASM
nasm im vermeintlichen Pfad installiert hat, nicht 7za.exe Anleitung. Stattdessen benutzte ich:
SET PATH = C: \ Programme \ 7-Zip; C: \ Benutzer \ james AppData \ Local \ \ nasm;% PATH%
Bauumgebung
Statt Zum Aufrufen des VC++ 2008 SetEnv-Befehls zum Erstellen der Build-Umgebung für die Befehlszeile habe ich die 'Developer Command Prompt for VS2015' verwendet.
PS: Ich begann damit, dass dies in einer VC++ 2008-Umgebung erstellt wurde, wo alle oben genannten angewendet wurden, aber zusätzlich musste ich das Problem unten lösen. Nachdem ich dies gelöst hatte, hatte ich die gleichen Probleme mit der Verbindung wie beim VS2015 Build.
Es gibt ein Problem beim Installieren des 7.1 SDK unter Windows 10 aufgrund einer nicht erkannten .NET-Version in der Registrierung. Siehe:
Cannot install Windows SDK 7.1 on Windows 10
Um das 7.1 SDK mit den vollen MSBuild Tool zu installieren, war es notwendig, alle Standorte in der Registrierung zu ändern (8, nicht die 2 berichtete, müssen suchen), wo die Version des installierten .NET-Software wird aufgezeichnet:
Können Sie die zusätzlichen Abhängigkeitsverzeichnisse/Linker-Optionen anzeigen? Das wäre hilfreicher. – Ram
Ich habe die Frage aktualisiert, um die Werte anzuzeigen, von denen ich glaube, dass Sie danach fragen. Beachten Sie die Korrektur für den ersten Eigenschaftsnamen. Wenn ich den Namen der lib in eine nicht existierende Datei ändere, wird ein Fehler ausgegeben, der besagt, dass die Eingabedatei nicht geöffnet werden kann. Daher glaube ich, dass diese Einstellungen den Linker zur richtigen Datei führen. –
Wenn Sie sich das Problem ansehen, woher das __imp-Präfix kommt, ist dies der Fall, wenn der Linker eine Verknüpfung zu einer DLL herstellen möchte. Daher ist die bereitgestellte .lib-Datei eine Importbibliothek für die DLL. Ich habe alle möglichen Tests mit den Optionen cl.exe und link.exe durchgeführt, konnte dieses Verhalten jedoch nicht ändern. Es stellt sich heraus, dass es in pyconfig.h einige Definitionen gibt, die das Linkverhalten steuern. Ich bin jetzt weiter gekommen, aber es scheint, dass es noch weitere Probleme geben wird. Siehe [dieser Python-Entwickler-Thread] (https://mail.python.org/pipermail/python-dev/2004-July/046499.html) Ich antworte später, wenn ich irgendwo hinkomme –