🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#26864
Author: ak3031884
Date: Wed, 07 Oct 2009 19:44
53 lines
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
#26865
Author: Bart Ogryczak
Date: Thu, 08 Oct 2009 13:01
47 lines
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
#26866
Author: Jacek Czerwinski
Date: Thu, 08 Oct 2009 13:08
27 lines
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
#26867
Author: Michał Żarłok
Date: Thu, 08 Oct 2009 15:35
16 lines
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
#26868
Author: ak3031884
Date: Thu, 08 Oct 2009 18:32
29 lines
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
#26869
Author: ak3031884
Date: Thu, 08 Oct 2009 19:29
18 lines
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
#26870
Author: Rob Wolfe
Date: Thu, 08 Oct 2009 20:24
78 lines
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
#26871
Author: ak3031884
Date: Fri, 09 Oct 2009 06:35
3 lines
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