Hi! I sometimes build LLVM with a static libc++.a in MacOS, so that I use the LLVM libc++ instead of the system-wide one. However, when doing so, I always get link errors when building LLVM, because the build system links with libc++.a, but not with libc++abi.a and so there are quite a few missing symbols that the linker cannot find. My workaround (which always seems to work) is to embed libc++abi inside of libc++ (with libtool, for example), but that's a hack for being in a hurry. BTW, note that I'm talking about building LLVM itself, not my programs (when you build your programs it doesn't hurt to add -lc++abi to your link line, but when building LLVM, how are you supposed to do it? I've searched for a cleaner solution to this, but couldn't find any. Isn't there any LLVM build option for simply telling "hey! don't forget to add -lc++abi whenever you link to libc++" ? Thanks! ardi
Petr Hosek via llvm-dev
2018-Oct-01 02:20 UTC
[llvm-dev] How to build LLVM linked to libc++abi?
You can use LIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON CMake option to statically link libc++abi into libc++.a. You can also use LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY=OFF to disable statically linking libc++abi into libc++.so (i.e. libc++abi will only be merged into libc++.a, not libc++.so). Similarly, you can also use LIBCXXABI_ENABLE_STATIC_UNWINDER=ON and LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY=OFF to the same for libunwind. Alternatively, you could rename libc++.a to libc++_internal.a and then create a linker script named libc++.a with the following content: INPUT(libc++_internal.a libc++abi.a) There's no support to do so in CMake at the moment, but it's something we've already discussed within Fuchsia as it'd be also useful for sanitizer runtimes so I might start a (separate) discussion about adding such support. On Sun, Sep 30, 2018 at 2:40 PM ardi via llvm-dev <llvm-dev at lists.llvm.org> wrote:> Hi! > > I sometimes build LLVM with a static libc++.a in MacOS, so that I use > the LLVM libc++ instead of the system-wide one. However, when doing > so, I always get link errors when building LLVM, because the build > system links with libc++.a, but not with libc++abi.a and so there are > quite a few missing symbols that the linker cannot find. > > My workaround (which always seems to work) is to embed libc++abi > inside of libc++ (with libtool, for example), but that's a hack for > being in a hurry. BTW, note that I'm talking about building LLVM > itself, not my programs (when you build your programs it doesn't hurt > to add -lc++abi to your link line, but when building LLVM, how are > you supposed to do it? I've searched for a cleaner solution to this, > but couldn't find any. > > Isn't there any LLVM build option for simply telling "hey! don't > forget to add -lc++abi whenever you link to libc++" ? > > Thanks! > > ardi > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180930/508877c0/attachment.html>
Thanks a lot, but tried it and I get this: CMake Error at projects/libcxx/CMakeLists.txt:361 (message): LIBCXX_ENABLE_STATIC_ABI_LIBRARY is not supported on OS X Why is it not supported? If I manually embed libc++abi.a inside libc++.a it seems to work. Thanks! ardi On Mon, Oct 1, 2018 at 4:20 AM Petr Hosek <phosek at chromium.org> wrote:> > You can use LIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON CMake option to statically link libc++abi into libc++.a. You can also use LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY=OFF to disable statically linking libc++abi into libc++.so (i.e. libc++abi will only be merged into libc++.a, not libc++.so). > > Similarly, you can also use LIBCXXABI_ENABLE_STATIC_UNWINDER=ON and LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY=OFF to the same for libunwind. > > Alternatively, you could rename libc++.a to libc++_internal.a and then create a linker script named libc++.a with the following content: > > INPUT(libc++_internal.a libc++abi.a) > > There's no support to do so in CMake at the moment, but it's something we've already discussed within Fuchsia as it'd be also useful for sanitizer runtimes so I might start a (separate) discussion about adding such support. > > On Sun, Sep 30, 2018 at 2:40 PM ardi via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> Hi! >> >> I sometimes build LLVM with a static libc++.a in MacOS, so that I use >> the LLVM libc++ instead of the system-wide one. However, when doing >> so, I always get link errors when building LLVM, because the build >> system links with libc++.a, but not with libc++abi.a and so there are >> quite a few missing symbols that the linker cannot find. >> >> My workaround (which always seems to work) is to embed libc++abi >> inside of libc++ (with libtool, for example), but that's a hack for >> being in a hurry. BTW, note that I'm talking about building LLVM >> itself, not my programs (when you build your programs it doesn't hurt >> to add -lc++abi to your link line, but when building LLVM, how are >> you supposed to do it? I've searched for a cleaner solution to this, >> but couldn't find any. >> >> Isn't there any LLVM build option for simply telling "hey! don't >> forget to add -lc++abi whenever you link to libc++" ? >> >> Thanks! >> >> ardi >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev