2016-04-10 4 views
0

мне удалось построить статическую библиотеку CPython на Windows 10, начиная с проектом здесь в качестве основы (построено на Visual C++ 2008):Строительство CPython статический на Windows - связывающие проблемы

https://github.com/zeha/python-superstatic

Первых , используя предписанные инструкции, я смог получить библиотеку, построенную в VS2015, путем поиска обходных решений, перечисленных ниже.

Как только библиотека была построена, я приступил к компиляции и компоновки приводимого примера источника с, но вскоре свел к следующему коду теста:

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

int main() 
{ 
    Py_Initialize(); 
    return 0; 
} 

мне пришлось удалить биту в pyconfig.h, который делает это:

pragma comment(lib,"python27.lib") 

, так что он будет искать символы в моей статической библиотеке.

Это не компилируется, потому что линкер жалуется:

Source.obj : error LNK2001: unresolved external symbol __imp__Py_Initialize 

я добавил путь к сгенерированной статической библиотеке, pythonembed.lib в:

Properties->Linker->General->Additional Library Directories 

Это значении:

/workspace/superstatic-python/Python-2.7.3/PCbuild 

Я также указал библиотеку в (попробовал как голое имя lib, так и абсолютное поглаживание ч):

Properties->Linker->Input->Additional Dependencies 

Это значение:

pythonembed.lib 

Запуск команды:

dumpbin.exe /all pythonembed.lib 

показывает, что есть символ имени _Py_Initialize. Я проверил, что как статическая библиотека, так и тестовый проект построены с использованием набора инструментов v140 в качестве выпуска для 32 бит.

Я пропустил какие-либо шаги по правильному подключению VC++?

Интересный бит в том, что код вызывает Py_Initialise, компоновщик ищет __imp__Py_Initialize, но статическая библиотека имеет символ: _Py_Initialize.

Относится ли это к решению?

ВОПРОСЫ разрешить построить статическую библиотеку на Windows 10 с VS2015:

GNU Patch

GNU патч не работает для меня. Он запускает UAC и загружается в новую консоль и ничего не делает. Кажется, это срабатывает, потому что он называется «patch.exe». Я нашел для себя различные обходы, но вместо этого я использовал патч Cygwin и поместил папку Cygwin bin в путь.

Ни версии 7zip загружающие пришли с 7za.exe, так что это было необходимо переименовать 7z.exe в 7za.exe

NASM

NASM не установлен в пути, допускаемых инструкции. Вместо этого я использовал:

SET PATH = C: \ Program Files \ 7-Zip, C: \ Users \ Джеймсе \ AppData \ Local \ NASM;% PATH%

Сложение среда

Вместо вызова команды SetEnv VC++ 2008 для создания среды сборки командной строки, я использовал «Командная строка разработчика для VS2015».

PS: Я начал с создания этого в среде VC++ 2008, где все вышеперечисленное было применено, но кроме того, мне пришлось решить проблему ниже. Как только я решил это, у меня были те же проблемы связи, что и с VS2015.

Существует проблема с установкой 7.1 SDK в Windows 10 из-за непризнанной версии .NET в реестре. См:

Cannot install Windows SDK 7.1 on Windows 10

Чтобы установить 7.1 SDK с полными инструментами MSBuild, нужно было изменить все места в реестре (8, а не 2 сообщил, нужно искать), где версию установленного Программное обеспечение .NET записано:

+0

Возможно ли показать каталоги дополнительной зависимости/параметры компоновщика? Это было бы более полезно. – Ram

+0

Я обновил вопрос, чтобы показать ценности, которые, я считаю, вы просите. Обратите внимание на поправку к первому имени свойства. Если я изменю имя lib на несуществующий файл, это приведет к ошибке, говорящей «не удается открыть файл ввода», поэтому я считаю, что эти параметры приводят компоновщик в нужный файл. –

+0

Изучая вопрос о том, откуда берется префикс __imp, это когда линкер хочет связать с DLL, поэтому считает, что предоставленный .lib является библиотекой импорта для DLL. Я делал всевозможные тесты с опциями, переданными в cl.exe и link.exe, но не мог изменить это поведение. Оказывается, в pyconfig.h есть некоторые определения, которые управляют поведением ссылок. Теперь я получил еще больше, но, похоже, впереди еще впереди. См. [Этот поток python-dev] (https://mail.python.org/pipermail/python-dev/2004-July/046499.html) Я отвечу позже, если я получу где-нибудь –

ответ

0

Чтобы получить исполняемый файл, успешно связанный с созданной статической библиотекой Python, необходимо было установить дополнительные параметры компилятора и включить несколько библиотек Windows.

Тот, кто хочет добиться, чтобы строить сами могут начать с этого тестового кода (сохранить как 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; 
} 

и следующий Makefile я создал:

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) 

Они должны идти в новой папке под базой ОС Superstatic Python, затем из окна 7.1 SDK build environment, просто запустите

nmake 

Если вам повезет, теперь у вас должен быть файл simple.exe, который для меня был 3,7 МБ и работал как ожидалось.

Смежные вопросы