2013-04-24 13 views
9

Sto cercando di eseguire moduli Python in C++ utilizzando "#include <Python.h>", però, dopo aver impostato il "inclusione aggiuntive Dipendenze" del progetto per "\ include" Ottengo il seguente errore quando debuging,Perché #include <Python.h> funziona?

LINK : fatal error LNK1104: cannot open file 'python27_d.lib' 

ho letto che dovrei scaricare la versione di sviluppo di Python, ma non ho trovato un collegamento per questo, in più, non ho solo bisogno che il file 'python27_d.lib' sia copiato nella cartella "libs"?

Si noti che sto usando la distribuzione Anaconda di Python.

Grazie in anticipo!

+0

Cosa intendi con "esegui i moduli Python in C++"? Per fare ciò, devi [incorporare un interprete Python] (http://docs.python.org/2/extending/embedding.html). Solo "#include " non lo fa. – abarnert

+1

Nel frattempo, hai letto [Creazione di estensioni C e C++ su Windows] (http://docs.python.org/2/extending/windows.html) e [Requisiti di collegamento] (http://docs.python.org/ 2/extending/embedding.html # linking-requirements) (per l'incorporamento)? Intendi incorporare il tuo interprete in modo statico o dinamico? Dove hai preso l'interprete che stai cercando di incorporare? – abarnert

+0

Probabilmente è più semplice costruire le librerie Python dal codice sorgente di Python. – Aya

risposta

6

Non so molto di Python, ma il messaggio indica che python27_d.lib non esiste, o almeno non esiste dove il linker lo sta cercando.

Hai già risolto il problema di inclusione del compilatore, ora trovi il file python27_d.lib con Windows Explorer e aggiungi quel percorso al percorso Dipendenze librerie aggiuntive. È in Configurazione -> Linker -> Generale -> Directory di libreria aggiuntive.

Il "_d" indica che si tratta di una libreria di debug, quindi sarà necessario quello per la configurazione di debug e quello senza "_d" (probabilmente) per la configurazione di rilascio.

+0

Grazie, quindi come ottengo la libreria di debug? – Curious

+0

Ah, mi dispiace, pensavo fosse solo un problema di VS. Guardandosi attorno sembra che la versione di rilascio (non "_d") sia distribuita, ma non "_d". Le persone hanno trovato un paio di modi per risolverlo qui: http://stackoverflow.com/questions/11311877/creating-a-dll-from-a-wrapped-cpp-file-with-swig –

+0

Ho provato la soluzione "#define MS_NO_COREDLL "e sembra funzionare grazie a milioni :), ma non capisco perché – Curious

0

Non è necessario utilizzare un build di debug Python ... [anche se non si sta aumentando l'utilizzo] Vorrei dare un'occhiata alla documentazione di boost.python dove hanno un wrapper per Python.h che gestisce tutti i problemi di debug di Windows, in modo che sia possibile creare un'estensione di debug su una release dll di python.

http://www.boost.org/doc/libs/1_53_0/libs/python/doc/building.html#id19 Python debug Builds

0

mi sono imbattuto in errori simili durante il tentativo di utilizzare Boost.Python per accedere package Python Anaconda dal C++. Lasciatemi iniziare dicendo che la mia impressione personale delle librerie C++ Boost è che sono una grande idea con documentazione incompleta. C'è una tonnellata di documentazione su boost.org, ma sembra invariabilmente lasciare fuori dettagli critici che gli autori sembrano considerare troppo banali per preoccuparsi di menzionarli. Ma lasciami scendere dal mio soapbox ...

L'impulso in corso per me per [speriamo, alla fine] capire come far funzionare Boost.Python sul mio sistema è che ci sono così tanti grandi pacchetti scientifici Python [ SymPy, Numpy, SciPy, matplotlib, ecc. Inclusi nella distribuzione di Anaconda e sarebbe davvero fantastico accedervi da progetti C++ creati con Qt Creator. E i documenti Boost sembrano suggerire che Boost.Python dovrebbe farlo per me. Ahimè, quei documenti sembrano tralasciare dettagli critici che gli autori sembrano considerare troppo banali per preoccuparsi di menzionare ...

Ad ogni modo, inizialmente, ho ricevuto un errore di compilazione che indica che python.h non è stato trovato. Mi sono liberato di quel con l'aggiunta di queste due affermazioni in un file .pro del mio progetto Qt Creator, che raccontano qmake dove Boost installato i propri file di inclusione e dove Anaconda installato il suo file Python.h sul mio sistema:

INCLUDEPATH += C:\boost_1_55_0 
INCLUDEPATH += C:\Anaconda\include 

Dopo di che , Ho ricevuto un errore LNK1104 che indica che "python27.lib" non è stato trovato. Mi sono sbarazzato di questo aggiungendo queste due dichiarazioni al mio file .pro. Il primo dice a qmake dove trovare il file python27.lib di Anaconda. Il secondo dice qmake dove trovare la spinta.binario python:

LIBS += "C:/Anaconda/libs" 
LIBS += "C:/boost_1_55_0/stage/lib/libboost_python-vc110-mt-gd-1_55.lib" 

Ma, questo è il massimo che ho ottenuto finora. Ora ricevo un errore che indica che non è possibile aprire il file 'C: /Anaconda/libs.obj' per il quale non ho ancora trovato una soluzione. L'errore, ovviamente, è causato da quel file non esistente. La sfida è scoprire perché viene ricercata e dove trovarla.

3

Metti Visual Studio in modalità di rilascio anziché di debug.

+0

È stata davvero questa risposta combinata con quella sopra che ha risolto il mio problema. Quindi i passaggi erano: (1) impostato sulla modalità di rilascio, non sul debug, (2) impostare il Linker in modo che punti al mio percorso Python. – rrs

19

Normalmente lo evito utilizzando la lib Python non debug nelle build di debug. In genere, questo porta ad un codice simile:

#ifdef _DEBUG 
    #undef _DEBUG 
    #include <Python.h> 
    #define _DEBUG 
#else 
    #include <Python.h> 
#endif 

dove si nasconde la definizione di _DEBUG durante l'inserimento di Python.h.

+1

DOH! Questa è la soluzione! Assicurati solo che la tua versione di debug si colleghi a python27.lib invece che a python27_d.lib. –

Problemi correlati