Linking static libraries with clang independent of order
Asked Answered
O

3

7

In GCC, I can use the linker flags -Wl,--start-group and -Wl,--end-group to resolve linking problems with libraries that have circular dependencies. I'd like to do the same with clang, but it seems like this feature was dropped in lld version 3.2. How do I do it?

Ogbomosho answered 23/9, 2014 at 3:5 Comment(8)
en.wikipedia.org/wiki/Technical_debtAnthropophagy
list all the libs (in any order) twice: -la -lb ...-lx -la -lb ... -lx (best done with a script)Authority
@Authority This may or may not be enough.Ambagious
@Ambagious should be -- this guarantees that for every symbol referenced in the object code, the ~definition will appear at least once after the reference / declarationAuthority
@Authority GNU ld will only include objects from an archive that it actually needs at that point. Knowing this one can easily construct a counterexample: pastebin.com/YSrNqT4hAmbagious
@Ambagious Well, this was my point exactly (on including only the already referenced objects), so your example fails?Authority
The example fails to link even though the libraries liba.a and libb.a are linked twice as you suggested. For this specific example you would need to add another -la in order to make it link.Ambagious
According to this change the switches should now be ignored and not needed since circular dependencies should always be resolved automatically. Maybe they are adopting same behavior as MSVC (which searches for symbols all libraries at any time)? Can someone confirm?Tousle
A
4

The release notes of LLVM 3.2 state that

llvm-ld and llvm-stub have been removed, llvm-ld functionality can be partially replaced by llvm-link | opt | {llc | as, llc -filetype=obj} | ld, or fully replaced by Clang.

By default clang seems to use the system linker. That is on Linux for example it uses the GNU ld:

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

This suggests that you can use -Wl,--start-group and -Wl,--end-group as with GCC.

Ambagious answered 14/10, 2014 at 13:26 Comment(1)
This is the case. Apple's ld tool doesn't support the --start-group flags, but it doesn't care about circular dependencies either.Ogbomosho
B
3

I'm not a fan of circular dependencies :) but here some say they handle this cases by linking some libraries twice. I haven't tried it but this might increase your code's footprint.

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

I don't know if this works with clang but it might worth a shot.

Best solution would be removing the circular dependencies as it will generate you more problems in the future.

Butter answered 13/10, 2014 at 19:52 Comment(0)
P
0

I had a similar problem linking with a custom clang compiler using a QT c++ project.

The problem turned out to be that QT was using clang (c compiler) rather than clang++ (c++ compiler). By defining the compiler as clang++ instead of clang in the QT project (setting QMAKE_CXX=clang++) the project linked successfully.

As I understand it, the same holds true for gcc and g++.

Phagy answered 18/5, 2015 at 14:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.