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
risposta
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.
Questo è il caso. Lo strumento ld di Apple non supporta i flag --start-group, ma non si preoccupa nemmeno delle dipendenze circolari. – Mokosha
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.
Non dovrebbe mai aumentare la dimensione del codice :) – mlvljr
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 ++.
https://en.wikipedia.org/wiki/Technical_debt –
elenca tutte le librerie (in qualsiasi ordine) due volte: '-la -lb ...- lx -la -lb ... -lx' (migliore fatto con una sceneggiatura) – mlvljr
@mlvljr Potrebbe essere o non essere sufficiente. – user1225999