Ho due progetti in una soluzione di Visual Studio. Uno costruisce un LIB statico, l'altro costruisce una DLL dinamica. Entrambi usano il collegamento di runtime statico (/ MT e/MTd), ed entrambi usano Boost. Boost non era una mia decisione, volevo buttarlo fuori ma sono stato respinto dal comitato."Mescolare una libreria di boost con un runtime statico è una pessima idea ..."
LIB crea correttamente, ma la DLL tosse un errore da auto_link.hpp (riga 354): "Mescolare una libreria di boost di DLL con un runtime statico è una pessima idea ...".
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
# define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
# error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
# define BOOST_LIB_PREFIX "lib"
#endif
Non ho definito BOOST_DYN_LINK. Sembra che Boost stia facendo un salto che dal momento che sto costruendo una DLL (_USRDLL e _WINDLL sono definiti), voglio il collegamento dinamico al runtime (/ MD o/MDd, che definisce _DLL) o il collegamento DLL contro Boost. Questo non è corretto in quanto ho chiesto specificamente per il collegamento statico (/ MT o/MTd).
Ho archiviato uno bug report contro Boost per le sue ipotesi errate, ma questo non mi aiuta con l'utilizzo della libreria. Nel report, i manutentori Boost insistono sul fatto che lo sto impostando (nonostante il fatto che un audit abbia dimostrato che non lo sono, e Boost lo manipola in almeno 30 file). Ho trovato one answer nella mailing list di Boost, che in sostanza afferma di cambiare le impostazioni del mio progetto per accogliere Boost.
Il passaggio a Dynamic Runtime Linking (/ MD e/MDd) non è possibile poiché il collegamento statico è stato scelto (1) a causa di considerazioni di sicurezza e (2) un'altra libreria utilizza il collegamento statico. Questo non è negoziabile, non abbiamo scelta.
Per riepilogare per chiarezza (TLDR): Voglio utilizzare il collegamento statico per tutto, mentre il mio programma di output è una DLL (non una LIB statica, non un EXE). Tutto è collegato staticamente alla DLL.
Qualcuno sa come utilizzare questa libreria su Windows per creare una DLL con collegamento statico?
È sufficiente rimuovere il controllo offendente da auto_link.hpp? O #undef _USRDLL e _WINDLL prima che auto_link.hpp sia incluso e poi ridefinirli in seguito? –
Ho appena avuto a che fare con questo un paio di settimane fa, anche se non riesco a ricordare i dettagli in cima alla mia testa. Abbiamo una DLL costruita contro CRT statico e boost statico e non ci sono errori/avvertenze. Lo controllerò domani se nessuno risponde da allora. – Luke
Si noti che * è estremamente pericoloso * creare una DLL che si collega staticamente alla libreria di runtime C. Ciò significa che la memoria allocata in una DLL non può essere direttamente liberata in un'altra. Questo potrebbe sembrare che non accadrà, ma può. E otterrai crash casuali da esso. –