Thread View: pl.comp.lang.python
8 messages
8 total messages
Started by ak3031884
Wed, 07 Oct 2009 19:44
kompilacja modułu c++ w pythonie
Author: ak3031884
Date: Wed, 07 Oct 2009 19:44
Date: Wed, 07 Oct 2009 19:44
53 lines
2965 bytes
2965 bytes
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?
Re: kompilacja modułu c++ w pythonie
Author: Bart Ogryczak
Date: Thu, 08 Oct 2009 13:01
Date: Thu, 08 Oct 2009 13:01
47 lines
2989 bytes
2989 bytes
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
> 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
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.
Re: kompilacja modułu c++ w pythonie
Author: Jacek Czerwinski
Date: Thu, 08 Oct 2009 13:08
Date: Thu, 08 Oct 2009 13:08
27 lines
1899 bytes
1899 bytes
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).
Re: kompilacja modułu c++ w pythonie
Author: Michał Żarłok
Date: Thu, 08 Oct 2009 15:35
Date: Thu, 08 Oct 2009 15:35
16 lines
1565 bytes
1565 bytes
Bart Ogryczak wrote: > On Oct 7, 9:44 pm, ak3031884 <ak3031...@gmail.com> wrote: >> 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? 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
Re: kompilacja modułu c++ w pythonie
Author: ak3031884
Date: Thu, 08 Oct 2009 18:32
Date: Thu, 08 Oct 2009 18:32
29 lines
2365 bytes
2365 bytes
On 8 Paź, 17:35, Michał Żarłok <mish...@gmail.com> wrote: > Bart Ogryczak wrote: > > On Oct 7, 9:44 pm, ak3031884 <ak3031...@gmail.com> wrote: > >> 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? > > 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 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.
Re: kompilacja modułu c++ w pythonie
Author: ak3031884
Date: Thu, 08 Oct 2009 19:29
Date: Thu, 08 Oct 2009 19:29
18 lines
2042 bytes
2042 bytes
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.
Re: kompilacja modułu c++ w pythonie
Author: Rob Wolfe
Date: Thu, 08 Oct 2009 20:24
Date: Thu, 08 Oct 2009 20:24
78 lines
4059 bytes
4059 bytes
ak3031884 <ak3031884@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
Re: kompilacja modułu c++ w pythonie
Author: ak3031884
Date: Fri, 09 Oct 2009 06:35
Date: Fri, 09 Oct 2009 06:35
3 lines
1621 bytes
1621 bytes
Wow!!! Tego mi było trzeba. Wielkie dzięki!!!
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads