2014-04-02 6 views
9

Quando uso Visual Studio 2012, con il collegamento automatico, non ho bisogno di aggiungere manualmente le librerie boost/POCO/python, dovrebbero essere aggiunte automaticamente. E se mi manca qualsiasi libreria, ricevo un messaggio del genere:In che modo il potenziamento del collegamento automatico rende la scelta?

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc110-mt-1_55.lib'

Ma come si sa quale file voglio collegare? Forse voglio collegare in modo dinamico, utilizzando boost_system-vs110-mt-1_55.lib, o voglio uno con gd o sgd nel nome?

Come si fa a scegliere?

Il problema è che il mio programma sta cercando librerie libboost_ ... (cioè statiche), quando cerco sistema, thread ed ecc., Ma vuole boost_ (cioè dinamico) per python, e io non capisco perché?

+0

se "auto-linkando" si riferisce all'uso di DLL, ciò non ti libera dal collegamento di .libs. Per utilizzare le DLL in fase di runtime, è necessario conoscere il contenuto di queste DLL in fase di compilazione, ed è qui che entrano in gioco i file .lib. Per quanto riguarda la versione, il runtime e mt/md (che tipo di modulo di runtime stai compilando, puoi vederlo nelle opzioni di VS per il tuo progetto), dovresti prima ispezionare il tuo progetto per decidere. –

+0

Sì, ho capito come fare una scelta da solo, compilando quel progetto usando MinGW non ho alcun problema. Ma Visual Studio ha scelto su se stesso, quindi NON POSSO scegliere, lo rende per me. E mi chiedo perché faccia una scelta del genere. La mia domanda è davvero: in che modo Visual Studio rende la scelta e come posso gestirla? – Arkady

+0

Puoi controllarlo anche da VS, dai un'occhiata al Linker-> riquadro Input per i .libs inclusi durante il collegamento e anche nelle directory Linker-> General-> Additional linking (IIRC) –

risposta

5

Visual Studio consente le direttive #pragma nel codice sorgente per impostare le opzioni del linker. Per "auto-linking", Boost usa questi #pragma's in combinazione con le macro esistenti.

In particolare, sembra che si stia cercando la macro BOOST_ALL_DYN_LINK.

+0

Come ho capito da boost/system/config.hpp, se BOOST_ALL_DYN_LINK non è definito, devo collegare tutte le librerie come statiche, che funziona per tutti tranne python in questo momento . Desidero davvero collegare tutte le librerie come statiche, in modo che il flag sia esattamente ciò di cui ho bisogno e i macro predefiniti siano abbastanza buoni. Ma anche se aggiungo (BOOST_ALL_STATIC_LINK) manualmente, non funziona. In qualche modo il mio compilatore pensa che boost.python non possa essere statico. E richiede una libreria Python dinamica anche se esiste flag BOOST_ALL_STATIC_LINK. E non so dove cercare di aggiustarlo. – Arkady

+0

@Arkady: prova ad essere specifico, usa 'BOOST_PYTHON_STATIC_LIB' – MSalters

Problemi correlati