2010-01-07 14 views
11

Używam biblioteki Boost Python do tworzenia rozszerzeń Pythona do mojego kodu C++. Chciałbym, aby móc powołać się od pytona 'powitalną' funkcji z kodu C++ poniżej:Budowanie przykładów python Pythona przy użyciu Visual Studio 2008

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

I kod Python:

import hello_ext 
print hello_ext.greet() 

udało mi się to zrobić przy użyciu bjam (hello_ext.pyd jest generowany i działa dobrze), ale teraz chciałbym go zbudować za pomocą Visual Studio 2008. A hello.dll zostanie zbudowany (ale nie będzie to plik hello_ext.dll ani jakikolwiek .pyd). Po wywołaniu mojego kodu Pythona pojawia się błąd:

ImportError: Brak modułu o nazwie hello_ext.

Po zmianie nazwy hello.dll do hello.pyd lub hello_ext.pyd, mam inną ImportError: load dll nie powiodło

Jak mogę zbudować poprawny plik .pyd użyciu VS 2008?

+0

Dla zainteresowanych w budowaniu takiego projektu z makefile (i GCC), patrz http://stackoverflow.com/questions/2003506/how-to-build-a-boost-dependent-project-using-regular-makefiles/2055958#2055958 – rafak

Odpowiedz

0

Upewnij się, że masz flagę -lpython26 (jeśli używasz python2.6) i nazwa pliku powinna być w twoim przypadku hello_ext.pyd.

10

Po pierwsze, upewnij się, że próbujesz zaimportować tylko wersję Release z Python; importowanie wersji debugowania nie powiedzie się, ponieważ wersje biblioteki środowiska wykonawczego nie są zgodne. Ja również zmienić swoje właściwości projektu tak, że wersja release wyprowadza .pyd plik:

Właściwości >> Linker >> wyjściowy:

$(OutDir)\$(ProjectName).pyd 

(ja też utworzyć akcję post-build do uruchamiania testów jednostkowych z python)

Następnie upewnij się zdefiniować następujące w pliku stdafx.h:

#define BOOST_PYTHON_STATIC_LIB 

Wreszcie, jeśli masz zainstalowany więcej niż jedna wersja Pythona, upewnij się, że jesteś I mportowanie odpowiedniej wersji python.h (w menu Narzędzia >> Opcje >> Projekty i rozwiązania >> Katalogi VC++ >> Dołącz pliki).

5

Błąd ImportError: load dll nie powiodło zwykle oznacza, że ​​moduł .pyd zależy od innych dll, że nie można znaleźć - często msvc * .dll. Możesz spróbować otworzyć plik .pyd w Notatniku i wyszukać ".dll". Następnie sprawdź, czy wszystkie zależności DLL istnieją w twoim katalogu lub PATH.

Albo użyć Dependency Walker który znajdzie brakujące zależności dla Ciebie

1

Chociaż jest to kwestia wydany kilka lat temu (wciąż nie jest łatwo znaleźć rozwiązanie), ale spotkać ten sam problem dzisiaj, a po wyszukaniu godzin, wreszcie znalazłem możliwe rozwiązanie.

  • Powodem jest tak samo proste, jak która jest zauważony przez @AndiDog plik .pyd budować zależy od innego .dll;
  • W moim przypadku jest to boost_python-vc120-mt-1_58.dll w folderze [C++ folderu doładowania]/scena/lib/
  • Więc, co mogę zrobić, to skopiować ten plik i wklej go w folderze plików .pyd, a następnie mój Python może prawidłowo importuj projekt, który zbudowałem.

  • Możliwe, że istnieją inne rozwiązania, takie jak: budowanie projektu nie zależy od biblioteki dynamicznej, zamiast tego użyj biblioteki statycznej. niektóre ze źródeł mówi o zdefiniowaniu BOOST_PYTHON_STATIC_LIB w VS Preprocessor, wtedy twój projekt nie będzie zależał od biblioteki dynamicznej (jestem nowym C++ er), ale upewnij się, że masz kompilację libboost_python-vcXXX-mt-1_58.dll w doładowaniu.

  • zdefiniować preprocesor, trasa jest: C/C++ -> Preprocessor-> Preprocessor Definitions-> edit BOOST_PYTHON_STATIC_LIB
Powiązane problemy