2014-09-23 1 views
6

In GCC, posso utilizzare i flag di linker -Wl,--start-group e -Wl,--end-group per risolvere i problemi di collegamento con le librerie con dipendenze circolari. Mi piacerebbe fare lo stesso con clang, ma sembra che questa funzione fosse dropped in lld version 3.2. Come lo faccio?Collegamento di librerie statiche con clang indipendente dall'ordine

+5

https://en.wikipedia.org/wiki/Technical_debt –

+0

elenca tutte le librerie (in qualsiasi ordine) due volte: '-la -lb ...- lx -la -lb ... -lx' (migliore fatto con una sceneggiatura) – mlvljr

+0

@mlvljr Potrebbe essere o non essere sufficiente. – user1225999

risposta

4

La release notes di LLVM 3.2 stato che

llvm-ld e llvm-stub sono stati rimossi, funzionalità llvm-ld può essere parzialmente sostituito da llvm-link | opt | {llc | come, llc -filetype = obj} | ld, o completamente sostituito da Clang.

Per impostazione predefinita, clang sembra utilizzare il linker di sistema. Questo è su Linux per esempio utilizza il ld GNU:

$ clang --version 
clang version 3.2 (branches/release_32 170558) 
... 
$ clang -Wl,--verbose 
GNU ld (GNU Binutils; devel:gcc/openSUSE_12.3) 2.24.0.20140403-196 
... 

Questo suggerisce che è possibile utilizzare -Wl, - start-gruppo e -Wl, - end-gruppo come con GCC.

+0

Questo è il caso. Lo strumento ld di Apple non supporta i flag --start-group, ma non si preoccupa nemmeno delle dipendenze circolari. – Mokosha

3

io non sono un fan di dipendenze circolari :) ma here alcuni dicono che gestiscono questi casi, collegando alcune librerie due volte. Non l'ho provato ma questo potrebbe aumentare l'impronta del tuo codice.

$(CC) -o myApp -lfoo -lbar -lfoo 

Non so se questo funziona con clang ma potrebbe valerne la pena.

La soluzione migliore sarebbe rimuovere le dipendenze circolari in quanto potrebbe generare più problemi in futuro.

+0

Non dovrebbe mai aumentare la dimensione del codice :) – mlvljr

0

Ho avuto un problema simile collegando un compilatore clang personalizzato usando un progetto QT C++.

Il problema era che QT utilizzava clang (compilatore c) piuttosto che clang ++ (compilatore C++). Definendo il compilatore come clang ++ anziché clang nel progetto QT (impostando QMAKE_CXX = clang ++) il progetto è stato collegato correttamente.

Come ho capito, lo stesso vale per gcc e g ++.