Wpis z mikrobloga

Programistyczne Mirki z #cpp #python

Czy ktoś z Was korzystał z pythonowej biblioteki ctypes?

Gdy pod linuksem wykonuje polecenia:

g++ -c -fPIC test.cpp -o test.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so test.o

Wszystko śmiga. Funkcja zwraca wartość do pythona tak jak powinna. Jednak dzieje się tak tylko pod linuxem. Pod windowsem gdy chcę wyprintować wartość zwróconą przez funkcję otrzymuję nan.

Windows:
2.5
2.93251
nan

Linux:
2.5
2.93251
2.93251

Domyślam się, że problem leży w interpretacji danych zwróconych z cpp do pythona. Stwierdziłem, że może windows potrzebuje dllki zamiast so, ale w tym przypadku jest jeszcze gorzej.

D:\cpp>python test.py
Traceback (most recent call last):
File "test.py", line 19, in
f = Foo()
File "test.py", line 12, in _init
self.obj = lib.Foo
new()
File "C:\Python27\lib\ctypes_init.py", line 375, in getattr
func = self.
getitem(name)
File "C:\Python27\lib\ctypes_
init_.py", line 380, in getitem
func = self.
FuncPtr((nameorordinal, self))
AttributeError: function 'Foo_new' not found

Program w pythonie (z loadem so):
https://pastebin.com/ZhkZf9d3

Program w pythonie (z dll):
https://pastebin.com/025J7Kat

Program w cpp:
https://pastebin.com/K7RSRNnD

Czy mógłbym liczyć na jakieś porady, albo wskazanie tutoriala, który przerabialiście i takie myki działały? Przyznam, że z cpp jestem zielony i jeśli porady miałyby być jakieś mega pro to prosiłbym jednak o wytłumaczenie jak krowie na rowie ;)
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@pshemeq: Standardowo chyba jest skompilowany poprzez MSVC, nie mam teraz jak sprawdzić, ale chyba raczej tak.
A no to tak z buta to nie zadziała, ABI MinGW i MSVC różnią się i trzeba się jakoś bawić atrybutami, żeby to zadziałało. Ja w to nie wnikałem, więc dużo nie pomogę.
Niby clang++ stara się być kompatybilny z MSVC, ale tak czy siak musisz go zainstalować żeby clang miał skąd brać biblioteki.
  • Odpowiedz