Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

kompilacja modułu c++ w pythonie

14 views
Skip to first unread message

ak3031884

unread,
Oct 7, 2009, 3:44:35 PM10/7/09
to
Witam,
próbuję swych sił w połączeniu C++ i Pythona napisałem prostą funkcję
w C++ na podstawie msdn
http://msdn.microsoft.com/en-us/library/aa385096(VS.85).aspx funkcja
pobiera jako argument adres url i powinna otworzyć przeglądarkę
internetową z adresem w pasku:

static PyObject *foo_OpenInternet(PyObject *self, PyObject *args){
char *url;
unsigned long Context = 777;
if(!PyArg_ParseTuple(args, "s", &url)){
return NULL;
}
HINTERNET hSession = InternetOpen("Raw HTML Reader",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hHttp = InternetOpenUrl(hSession, url, NULL, -1L,
INTERNET_FLAG_RELOAD, Context);
return Py_BuildValue("s", hHttp);
}

korzystam z kompilatora Mingw, plik setup.py wygląda tak:

from distutils.core import setup, Extension
setup(name='foo',
version='1.0',
ext_modules=[Extension('foo', ['foo.c'])],
#options = {"py2exe": { "dll_excludes": ["wininet.dll"]}},
)

komenda "python setup build"

plik setup działa na pewno bo przy testowaniu funkcji typu "hello
world" ładnie kompiluje
w przypadku tej funkcji mam taki problem:

build\temp.win32-2.5\Release\foo.o(.text+0xb5):foo.c: undefined
reference to `InternetOpenA@20'
build\temp.win32-2.5\Release\foo.o(.text+0xe7):foo.c: undefined
reference to `InternetOpenUrlA@24'
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1

skorzystałem z
"from internet import google
google.search(..."

znalazłem takie rozwiązanie:
If you're using dev-c++ or any sort of MinGW, add -lwininet to the
linker paramaters.
-l wininet
gdybym korzystał z g++ to może i by poszło jednak stosuje python setup
i nie bardzo wiem jak z tej rady skorzystać. A może jest błąd w samej
funkcji?

Bart Ogryczak

unread,
Oct 8, 2009, 9:01:15 AM10/8/09
to
On Oct 7, 9:44 pm, ak3031884 <ak3031...@gmail.com> wrote:
> Witam,
> próbuję swych sił w połączeniu C++ i Pythona napisałem prostą funkcję
> w C++ na podstawie msdnhttp://msdn.microsoft.com/en-us/library/aa385096(VS.85).aspx  funkcja

A #include <Wininet.h> w kodzie masz?

ATSD, wiesz, że w ten sposób to się pisze moduły C, a nie C++?
Łączenie C++ z Pythonem jest nieco bardziej skomplikowane.

Jacek Czerwinski

unread,
Oct 8, 2009, 9:08:12 AM10/8/09
to
Bart Ogryczak pisze:

> On Oct 7, 9:44 pm, ak3031884 <ak3031...@gmail.com> wrote:

>> from distutils.core import setup, Extension
>> setup(name='foo',
>> version='1.0',
>> ext_modules=[Extension('foo', ['foo.c'])],
>> #options = {"py2exe": { "dll_excludes": ["wininet.dll"]}},
>> )
>>
>> komenda "python setup build"
>>

>> plik setup dzia�a na pewno bo przy testowaniu funkcji typu "hello
>> world" �adnie kompiluje


>> w przypadku tej funkcji mam taki problem:
>>
>> build\temp.win32-2.5\Release\foo.o(.text+0xb5):foo.c: undefined
>> reference to `InternetOpenA@20'
>> build\temp.win32-2.5\Release\foo.o(.text+0xe7):foo.c: undefined
>> reference to `InternetOpenUrlA@24'
>> collect2: ld returned 1 exit status
>> error: command 'gcc' failed with exit status 1
>
> A #include <Wininet.h> w kodzie masz?

Mi to linkerem pachnie ... jakiego� 'lib'-a trzeba zapoda� (byc mo�e
wininet.lib, nie wchodze w szczeg�ly).

Michał Żarłok

unread,
Oct 8, 2009, 11:35:55 AM10/8/09
to
Bart Ogryczak wrote:

Eee tam, to nie brak nagłówków. Błędy typu "undefined reference" to błędy
linkera. Tak jak Jacek Czerwiński mówi, trzeba dodać jakąś bibliotekę.

Michał Żarłok

ak3031884

unread,
Oct 8, 2009, 2:32:50 PM10/8/09
to


nagłówki mam takie
#include <Python.h>
#include <stdio.h>
#include <windows.h>
#include <wininet.h>

błędy linkera tak szczerze temat rozgryzam i jeszcze sie nie bardzo
orientuje z linkerami może jakaś podpowiedź.
byłbym wdzięczny za jakieś fachowe tutoriale łącznia pythona i C++
gdyż przeważnie to jest jednak C i po przerobieniu tych które
znalazłem to raczej mam mętlik.

ak3031884

unread,
Oct 8, 2009, 3:29:41 PM10/8/09
to
zrobiłem tak na okrętkę:
skopiowałem bibliotekę wininet.dll do katalogu Mingw
komenda python setup.py build
zbudował mi katalog build z pokatalogami i plikami następnie
z pliku setup.py wywołana jest w cmd komenda C:\MinGW\bin\gcc.exe -
mno-cygwin -shared -s build\temp.win32-2.5\Release\foo.o build
\temp.win32-2.5\Release\foo.def -LC:\Python25\libs -LC:
\Python25\PCbuild -lpython25 -lmsvcr71 -lwininet -o build
\lib.win32-2.5\foo.pyd

jak widać dodałem -lwininet
potem python setup.py install
i moduł zainstalowany
help(foo) pokazuje metody itp.
co nie znaczy że kod działa jak należy.
muszę jednak poczytać o c++ i pythonie jak macie coś fajnego to bardzo
bym prosił.
dzięki.


Rob Wolfe

unread,
Oct 8, 2009, 4:24:03 PM10/8/09
to
ak3031884 <ak30...@gmail.com> writes:

> nag��wki mam takie


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

> b��dy linkera tak szczerze temat rozgryzam i jeszcze sie nie bardzo
> orientuje z linkerami mo�e jaka� podpowied�.
> by�bym wdzi�czny za jakie� fachowe tutoriale ��cznia pythona i C++
> gdy� przewa�nie to jest jednak C i po przerobieniu tych kt�re
> znalaz�em to raczej mam m�tlik.

Hej,

je�li dopiero zaczynasz nauk� tworzenia rozszerze� Pythona,
to musz� przyzna� �e trudniejszego przypadku nie mog�e� znale��. ;)
Mam na my�li po��czenie C++/MinGW/Windows. Ka�da inna konfiguracja
to pestka, ale ta jest do�� skomplikowana.
Jak jeszcze nie uciek�e� z krzykiem, to spr�buj� Ci to troch�
rozja�ni�. ;)
(Pisz� z pami�ci bo z Wind� nie mam za bardzo do czynienia)

Zgadza si�, �e Tw�j problem wzi�� si� z b��d�w linkowania,
czyli musisz dostarczy� linkerowi w�a�ciwych (czytaj: takich,
kt�rych mo�e uzy� MinGW) i wszystkich potrzebnych biblioteki import�w.

Zaczynamy od przeczytania stosownej dokumentacji:
http://docs.python.org/distutils/setupscript.html#library-options
http://docs.python.org/extending/building.html

Od razu rzuca nam si� w oczy, �e nasz `setup.py` m�g�by wygl�da� tak:

<code>


from distutils.core import setup, Extension

foo = Extension('foo',
include_dirs = ['C:/MinGW/include'],
library_dirs = ['C:/MinGW/lib'],
libraries = ['stdc++', 'wininet'],
sources = ['foo.c'])

setup(name='MojPakiet',
version='1.0',
ext_modules= [foo])
</code>

Zauwa�, �e skoro to ma by� C++, to musisz do linkowania do��czy�
bibliotek� `stdc++` (nie pami�tam, czy jak nazwiesz plik �r�d�owy
z rozszerzeniem ".cpp", to czasem nie jest odpalane g++, czyli wtedy
do��czanie stdc++ nie jest potrzebne).

No i oczywi�cie biblioteki, kt�re zawieraj� funkcje, kt�rych chcesz u�y�.
Przy tak zdefiniowanym `setup.py` MinGW b�dzie szuka� w "C:\MinGW\lib"
plik�w `libstdc++.a`, `libwininet.a` i `libpython25.a`,
kt�rych musisz mu dostarczy�. Je�li takowe nie istniej�, to musisz
je stworzy� w�asnor�cznie, a robisz to tak:
http://eli.thegreenplace.net/2008/06/28/compiling-python-extensions-with-distutils-and-mingw/

Czyli jak juďż˝ pobierzesz `pexports` odpalasz:
pexports C:\Python25\python25.dll > C:\MinGW\lib\python25.def
dlltool -d C:\MinGW\lib\python25.def -l C:\MinGW\lib\libpython25.a
pexports C:\Windows\wininet.dll > C:\MinGW\lib\wininet.def
dlltool -d C:\MinGW\lib\wininet.def -l C:\MinGW\lib\libwininet.a

`libstdc++` musi byďż˝ dostarczona z MinGW.

No i zapuszczasz kompilacj� z podaniem kompilatora, kt�rego chcesz u�y�:
http://docs.python.org/install/index.html

python setup.py build --compiler=mingw32


Jednak tak naprawdďż˝ to do takich zabaw zdecydowanie polecam `ctypes`:
http://docs.python.org/library/ctypes.html#module-ctypes

RW

ak3031884

unread,
Oct 9, 2009, 2:35:17 AM10/9/09
to
Wow!!!
Tego mi było trzeba.
Wielkie dzięki!!!

0 new messages