2012-12-07 18 views
41

mingw Io uso da qui: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/downloadcome fare il collegamento statico di libwinpthread-1.dll in mingw?

e ho con successo riuscito a collegare staticamente libstdc++-6.dll e libgcc_s_sjlj-1.dll utilizzando -static-libgcc -static-libstdc++ parametri, ma non riesco a trovare un comando per fare lo stesso con libwinpthread-1.dll.

+5

Solo per motivi di chiarezza tecnica, se si sta collegando staticamente, non si sta collegando alla DLL. Le librerie 'libgcc' e' libstdC++ 'hanno versioni statiche e non statiche (DLL) e, se si collega staticamente, non si sta collegando alle DLL. Si vuole linkare staticamente alla libreria 'pthreads', non a' libwinpthread-1.dll' (dato che non si può linkare staticamente ad una libreria dinamica ... che vanifica lo scopo di una libreria dinamica). – Cornstalks

+0

Ottengo: 'C++: errore: opzione della riga di comando non riconosciuta '-static-pthreads'', lo stesso con' winpthreads' – rsk82

+0

Gotcha veloce: il libwinpthread-1.dll che viene fornito con mingw non è lo stesso di quello (s)) galleggiante su Internet. Usando quello sbagliato si otterrà una chiamata DLL infinitamente ricorsiva (secondo il Deambulatore di dipendenza) seguita da un overflow dello stack. – Mohan

risposta

17

È consigliabile controllare la documentazione delle opzioni della riga di comando per GCC.

Non c'è un comando '-statico-qualcosa', solo le librerie standard (libgcc e libstdC++) possono essere impostate su collegamento statico con un comando. Per le altre librerie, si passa prima al collegamento statico con "-static" e quindi si elencano le librerie da includere con comandi separati, ad esempio "-lpthread".

+0

Ho scoperto che questo problema è emerso quando sono passato dall'utilizzo di una versione di mingw che ho scaricato alla versione installata da apt-get su Ubuntu. La versione di apt-get è più vecchia, ma penso che il problema derivi da una diversa configurazione utilizzata per creare il set di strumenti mingw. L'aggiunta di "-static -lpthread" ha risolto il problema. – nmgeek

+0

'libgcc' non è una libreria standard. Vedi [qui] (https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html) –

33

Se il toolchain include i winpthreads statiche, aggiungendo l'opzione

-static 

tirerà nelle versioni statiche di tutte le biblioteche si può.

In alternativa, è possibile rimuovere libwinpthread.dll.a e la DLL stessa dalle directory del toolchain. Ciò potrebbe rovinare i programmi che si collegano con libstdC++ e libgcc DLL, quindi fai attenzione.

Una terza opzione è utilizzare -Wl,-Bdynamic e -Wl,-Bstatic per selezionare la versione che si desidera collegare (che è ciò che fa internamente -static quando viene chiamato ld). Un esempio:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic 

Se si esegue il comando di legame con -v aggiunta, si dovrebbe vedere queste opzioni che compaiono nella ld/invocazione collect2 quando si utilizza -static-libgcc e -static-libstdc++.

+0

Grazie mille! – kometen

+0

Funziona bene per me con MinGW64. – Spiralwise

-2

Ho avuto lo stesso problema. Sto usando Code :: Blocks, e ho avuto successo con l'aggiunta di una riga aggiuntiva in Commmands linker:

-lpthread -L libwinpthread-1.dll 

Questo comando deve essere aggiunto ovunque si sceglie di implementare altri comandi linker quali:

-static-libgcc 
-static-libstdc++ 

I non ricevere errori o avvisi di compilazione durante l'implementazione di questo comando. La prima direttiva, -lpthread, specifica il file di intestazione e la direttiva di trascinamento, -L, viene utilizzata per collegare un file specifico.

Sto utilizzando gcc versione 4.8.1. Questa versione successiva contiene correzioni di bug per * to_string *, ad esempio di cui avevo bisogno.

+0

Nello spirito di completa divulgazione, ho provato l'exe con la riga "-lpthread ..." sopra, e ancora produce l'errore di runtime di un libwinpthread-1.dll mancante. La linea non produce errori con il linker. Il comando generale "statico", un'altra risposta su questo thread, è la prima soluzione che ho trovato finora. – yellowjacket05

+2

Questo è assolutamente sbagliato. '-l' non fa nulla con i file di intestazione. – rubenvb

+0

@rubenvb a quanto pare non hai letto il mio commento prima. – yellowjacket05

-2

Basta aggiungere -static al numero CFLAGS.

Ad esempio: ./configure CFLAGS="-static".

Collegherà tutte le librerie statiche al file eseguibile.

+2

'CFLAGS' non dovrebbe influenzare i comandi del linker ... – rubenvb

21

Prova questo:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic 

Avviso della prima -lstdc++-lpthread. Ha funzionato per me.

Assicurarsi di aggiungerlo alla fine della riga di comando g++.

+1

Questo non funziona, purtroppo, a meno che non rimuovo il trailing' -Wl, -Bdynamic' (che non ha senso). –

+0

@ rr- Prova a usare gcc -v per stampare informazioni dettagliate, inviarlo a me. E lo esaminerò. –

+2

Penso di averlo capito ... Ho bisogno di 'libwinpthread-1.dll' solo se compilo con' libstdC++ 'statico, nel mio ambiente (arch e repository ufficiali) la versione statica di libstdC++ dipende dal winpthread condiviso. Per aggirare questo probabilmente ho bisogno di compilare me stesso mingw-w64. –

1

Per tutti coloro che lavorano in CMake, questa soluzione è facilmente implementato nel file CMakeLists.txt come segue ...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") 
7

Per collegare in modo statico winpthread anche se threading non viene utilizzato nel programma, passare i parametri -Bstatic e --whole-archive al linker:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive 

Nota seguente:

  • L'opzione "intero archivio" deve essere disabilitata subito dopo.
  • Non è necessario eseguire questa operazione se il programma utilizza effettivamente i simboli della libreria (ad esempio, si utilizza <thread> da C++ 11), nel qual caso la libreria non verrà rilasciata quando la si collega staticamente.
  • Questo trucco è destinato a MinGW-w64, per risolvere le dipendenze di libwinpthread-1.dll.
Problemi correlati