Python — Сборка CPython статически в Windows — проблемы с компоновкой

Мне удалось построить статическую библиотеку CPython в Windows 10, начав с проекта здесь в качестве основы (построенного вокруг Visual C ++ 2008):

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

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

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

#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

Я также указал библиотеку в (пробовал как пустое имя библиотеки и абсолютный путь):

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 и поместил папку bin Cygwin в путь.

Ни одна из версий 7zip не шла с файлом 7za.exe, поэтому необходимо было переименовать 7z.exe в 7za.exe.

NASM

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

SET PATH = C: \ Program Files \ 7-Zip; C: \ Users \ james \ AppData \ Local \ nasm;% PATH%

Построить среду

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

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

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

Не удается установить Windows SDK 7.1 в Windows 10

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

1

Решение

Чтобы успешно выполнить связывание исполняемого файла с сгенерированной статической библиотекой 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, затем из среды сборки Windows 7.1 SDK просто запустите

nmake

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector