2013-02-02 20 views
9

Provo a creare un programma con librerie di toolchain collegate statiche. passo:Collegamento statico con libwinpthread

LDFLAGS="-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic -static-libgcc -static-libstdc++" 

ma programma collegato con condiviso libwinpthread-1.dll.

Cosa faccio di sbagliato?

L'unico modo per ottenere libwinpthreads con collegamento statico è passare -static a LDFLAGS. Ma rompe i programmi di build con il sistema di plugin.

Io uso mingw-W64 + GCC-4.7.2 dal progetto MinGW-costruisce: http://sourceforge.net/projects/mingwbuilds/

+1

Non so il motivo per cui l'opzione '-Bstatic' non sembra funzionare, ma probabilmente si può ottenere ciò che si desidera specificando il file di libreria specifica invece di lasciare che' di ricerca ld' per esso: http : //stackoverflow.com/a/14494371/12711 –

+2

Nella mia distribuzione MinGW l'archivio statico si chiama 'libpthread.a' (sì, quello dinamico è' libwinpthread-1.dll'), quindi preferirei usare '-lpthread'.Probabilmente lo stesso è valido per il tuo. –

+0

Possibile duplicato di [come fare il collegamento statico di libwinpthread-1.dll in mingw?] (Https://stackoverflow.com/questions/13768515/how-to-do-static-linking-of-libwinpthread-1-dll -in-mingw) –

risposta

1

non si sta facendo nulla non corretta, Mingw-costruisce opere che modo si.

Recentemente ho inciampato su questo, ma per un altro motivo:

Mingw-Costruisce automaticamente i collegamenti eseguibili a GCC librerie dinamiche (libwinpthread-1.dll, libstdC++ - 6.dll, libgcc_s_dw2-1.dll) per salva la dimensione dell'eseguibile (problema: quando rilasci gli eseguibili devi ricordare di aggiungere anche le DLL mancanti insieme al tuo binario perché non c'è alcuna garanzia che gli utenti abbiano quelle DLL nei loro sistemi)

Nel mio caso il problema era che avevo più GCC pakcages sullo stesso sistema e quindi non li ho aggiunti a PATH per evitare conflitti di nome.

La parte divertente è che CMAKE prima di configurare il progetto genera un C-SourceFile che viene compilato e utilizzato per ottenere informazioni sul tuo compilatore, dal momento che le DLL non erano in PATH, che piccolo eseguibile generato da CMake stava crollando a causa di DLL mancanti e questo ha fermato l'intero processo di costruzione.

La soluzione da risolvere che aggiunge il percorso del compilatore a PERCORSO TEMPORANEAMENTE (o meglio eseguire CMake in un altro ambiente).

Aggiunta di DLL manualmente nella directory temporanea cmake non funziona perché cmake pulitura quella directory ad ogni configurazione ..

Se si utilizza mingwbuilds si deve collegare a pthreadBLAH.dll alcuna soluzione

7

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++.

+0

ha funzionato per me: gcc 4.9.2 su x64 – cap

+0

Perché -lstdC++ before -lpthread quando abbiamo già -static-libstdC++ ?? –

+0

@ kawing-chiu Non lo so. Funziona e se cambio l'ordine si rompe. ;-) –

0

Non è l'ideale, ma se non ti dispiace fare il plonking delle tue DLL di runtime nella stessa directory del tuo eseguibile, puoi aggiungere qualcosa di simile nel tuo file CMakeLists.txt. Ciò copierà le DLL necessarie dalla directory bin MingW nella directory di generazione corrente.

# ... 
# change to name of your project 
set(TARGET_NAME ${PROJECT_NAME}) 
# change to path to your minw bin directory 
set(MINGW_BIN_PATH "C:\\Program Files\ \(x86\)\\mingw-w64\\i686-4.9.2-posix-dwarf-rt_v3-rev1\\mingw32\\bin") 

set(LIBGCC_DLL "${MINGW_BIN_PATH}\\libgcc_s_dw2-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBGCC_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBSTDCPP_DLL "${MINGW_BIN_PATH}\\libstdc++-6.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBSTDCPP_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>) 
set(LIBWINPTHREAD_DLL "${MINGW_BIN_PATH}\\libwinpthread-1.dll") 
add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
        ${LIBWINPTHREAD_DLL} $<TARGET_FILE_DIR:${TARGET_NAME}>)