Hi
I am trying to compile simple project consisting of an executable “app” and static library “bar”.
Note that I’m enabling thinLTO for both “app” and “bar”.
////////////////////////////////////////
// bar.h //////////////////////////////////////////
#ifndef BAR
#define BAR
void bar ();
#endif
////////////////////////////////////////
////////////////////////////////////////
// bar.cpp //
////////////////////////////////////////
#include “bar.h”
#include
void bar ()
{
std::cout << “Bar” << std::endl;
}
////////////////////////////////////////
////////////////////////////////////////
// app.cpp //
////////////////////////////////////////#include “bar.h”
#include
int main()
{
std::cout << “App” << std::endl;
bar();
}
////////////////////////////////////////
When I’m using llvm-ar and llvm-ranlib to create static library everything works fine:
$ clang++ -flto=thin -c bar.cpp -o bar.o
$ llvm-ar cr bar.a bar.o
$ llvm-ranlib bar.a
$ clang++ -flto=thin -c app.cpp -o app.o
$ clang++ -flto=thin -o app app.o bar.a
However using default ar and ranlib provided by my GNU/Linux distribution results in linking failure:
$ clang++ -flto=thin -c bar.cpp -o bar.o
$ ar cr bar.a bar.o
$ ranlib bar.a
$ clang++ -flto=thin -c app.cpp -o app.o
$ clang++ -flto=thin -o app app.o bar.a
bar.a: error adding symbols: Archive has no index; run ranlib to add one
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Note that for GCC using default ar and ranlib works fine:
$ g++ -flto -c bar.cpp -o bar.o
$ ar cr bar.a bar.o
$ ranlib bar.a
$ g++ -flto -c app.cpp -o app.o
$ g++ -flto -o app app.o bar.a
Obviously using gcc-ar and gcc-ranlib also works fine:
$ g++ -flto -c bar.cpp -o bar.o
$ gcc-ar cr bar.a bar.o
$ gcc-ranlib bar.a
$ g++ -flto -c app.cpp -o app.o
$ g++ -flto -o app app.o bar.a
My question is: Can I use ar and ranlib provided by GNU/Linux with clang++?
If not, then to properly setup clang as a default compiler on GNU/Linux machine,
I should not only run update-alternatives for cc and c++ commands,
but also somehow do that for ar and ranlib commands?
$ sudo update-alternatives --config cc
$ sudo update-alternatives --config c++
That’s very problematic since update-alternatives doesn’t work with ar and ranlib:
$ sudo update-alternatives --config ar
update-alternatives: error: no alternatives for ar$ sudo update-alternatives --config ranlib
update-alternatives: error: no alternatives for ranlib
If default ar and ranlib is expected to not work with clang++,
then how should I setup Clang as a default compiler on GNU/Linux?
Thanks, Mateusz Zych