2016-04-10 10 views
0

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:

+0

Können Sie die zusätzlichen Abhängigkeitsverzeichnisse/Linker-Optionen anzeigen? Das wäre hilfreicher. – Ram

+0

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. –

+0

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 –

Antwort

0

Um eine ausführbare Verknüpfung erfolgreich zu der generierten statischen Python-Bibliothek zu erhalten, war es notwendig, einige zusätzliche Compiler-Optionen festzulegen und einige Windows-Bibliotheken einzuschließen.

Wer den Bau zu vollenden will sich mit diesem Testcode beginnen (speichern als simple.c):

#include <stdio.h> 
#include <Python.h> 

int main() 
{ 
    Py_Initialize(); 
    PyRun_SimpleString(
     "print 'This program contains a static version of Python." 
    ); 
    Py_Finalize(); 
    return 0; 
} 

und die folgende Makefile I erstellt:

PYTHON_V=2.7.3 
OPENSSL_V=1.0.1c 
ROOT=..\\ 

CFLAGS=/c /GF /MP4 /nologo /EHsc /I$(ROOT)openssl-$(OPENSSL_V)\inc32 \ 
    /I$(ROOT)Python-$(PYTHON_V)\Include /I$(ROOT)Python-$(PYTHON_V)\PC \ 
    /D Py_NO_ENABLE_SHARED /D Py_BUILD_CORE \ 
    /DPy_BUILD_CORE /MD /W4 /O2 
LINKFLAGS=/MACHINE:X86 /RELEASE /LTCG /NODEFAULTLIB:LIBCMT 
LIBS=$(ROOT)openssl-$(OPENSSL_V)\out32\libeay32.lib \ 
    $(ROOT)openssl-$(OPENSSL_V)\out32\ssleay32.lib \ 
    $(ROOT)Python-$(PYTHON_V)\PCbuild\pythonembed.lib ws2_32.lib msvcrt.lib user32.lib shell32.lib advapi32.lib oleaut32.lib Gdi32.Lib Ole32.lib 
CC= cl 
LINK= link 

all: simple.exe 

simple.obj: 
    $(CC) $(CFLAGS) simple.c 

simple.exe: simple.obj 
    $(LINK) $(LINKFLAGS) -out:simple.exe simple.obj $(LIBS) 

Diese sollten gehen Führen Sie in einem neuen Ordner unter dem Superstatic Python-Basisordner und dann in der Windows 7.1 SDK-Build-Umgebung einfach

aus

Mit etwas Glück sollten Sie nun simple.exe in Ihrem Ordner haben, was für mich 3,7 MB war und wie erwartet ausgeführt wurde.