Как связать C lib с python для встраивания под Windows?

1

Я работаю над приложением, написанным на C. Одна часть приложения должна вставлять python, и есть моя текущая проблема. Я пытаюсь связать свой источник с библиотекой Python, но он не работает.

Как я использую MinGW, я создал файл python26.a из python26.lib с dlltool и поместил файл *.a в C:/Program Files (x86)/python/2.6/libs.

Поэтому я скомпилирую файл с помощью этой команды:

gcc -shared -o mod_python.dll mod_python.o "-LC:\Program Files (x86)\python\2.6\libs" -lpython26 -Wl,--out-implib,libmod_python.a -Wl,--output-def,mod_python.def

и я получаю эти ошибки:

Creating library file: libmod_python.a
mod_python.o: In function `module_init':
mod_python.c:34: undefined reference to `__imp__Py_Initialize'
mod_python.c:35: undefined reference to `__imp__PyEval_InitThreads'
... and so on ...
  • Папка "root" My Python C:\Program Files (x86)\python\2.6
  • Devsystem - это Windows Server 2008
  • Информация GCC: Reading specs from C:/Program Files (x86)/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.5 (mingw-vista special r3)

Чем я ошибаюсь? Как я его скомпилировал и связал: -)?

Приветствия, gregor


Edit: Я забыл написать информацию о моей установке Python: официальная установка python.org 2.6.1

... и как я создал файл python.a:

dlltool -z python.def --export-all-symbols -v c:\windows\system32\python26.dll

dlltool --dllname c:\Windows\system32\python26.dll --def python.def -v --output-lib python26.a
Теги:
linker
gcc

3 ответа

2
Лучший ответ

Хорошо в Windows дистрибутив python поставляется уже с libpython26.a в поддирете libs, поэтому нет необходимости генерировать файлы .a с помощью инструментов dll.

Я попробовал небольшой пример с одним C файлом toto.c:

gcc -shared -o ./toto.dll ./toto.c -I/Python26/include/ -L/Python26/libs -lpython26

И это работает как шарм. Надеюсь, это поможет: -)

  • 1
    Хм ... ты прав. На моем ПК на работе у меня есть libpython26.a . Это должно быть новым в дистрибутиве Python 2.6.2? Потому что дома с Python 2.6.1 у меня его не было. Отлично. Я должен изменить ваш ответ на правильный!
  • 0
    Краткое обновление: работает отлично! Спасибо всем большое.
1

IIRC, dlltool не всегда работает. Наличие python 2.6 + Wow делает работу еще менее вероятной. Для numpy, вот как я сделал это. В основном, я использую obdump.exe для построения таблицы из dll, которую я анализирую для генерации .def. Вы должны проверить, находятся ли ваши отсутствующие символы в файле .def, иначе он не будет работать.

  • 0
    Вы правы, файл .def не содержит отсутствующих функций. Я пробую твой путь ...
  • 0
    ... хорошо, что бы я ни пытался, я не получаю правильные записи в файле .def. Постараюсь дальше
1

Python (по крайней мере, мой дистрибутив) поставляется с программой "python-config", которая автоматически создает правильные параметры компилятора и компоновщика для различных ситуаций. Однако я никогда не использовал его в Windows. Возможно, этот инструмент может вам помочь?

  • 0
    Как я вижу, python-config доступен только в системах * nix. Но спасибо за идею. Теперь я могу сделать мой make-файл лучше под эти системы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню