Mam projekt C++, który używa biblioteki C++, którą również napisałem. Używam clang ++ 3.3 do budowania wszystkiego. Każdy plik w bibliotece jest kompilowany jakoTworzenie i używanie bibliotek Bitcode LLVM
clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc
jestem następnie za pomocą LLVM-link, aby połączyć wszystkie biblioteki * .BC plików w jednym pliku kodu trochę jak tak
llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc
jestem konceptualizacja tego jest podobna do tworzenia archiwum plików obiektowych, ale nie sądzę, że jest to prawda w oparciu o to, jak działają.
Następnie kompiluję pliki źródłowe mojego projektu, używając polecenia podobnego do powyższego. Następnie używać LLVM-link (znowu), aby połączyć je, wraz z plikiem bitowy kod biblioteki do pojedynczego pliku z kodem nieco podobny do tego
llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc
Następny skompilować app.bc1 do natywnego pliku obiektu
llc -filetype=obj app.bc1 -o app.o
końcu używam dzyń ++ ponownie połączyć ten natywny plik obiektowy (i wobec innych natywnych bibliotek muszę, takich jak C++ standardowej biblioteki, etc)
clang++ app.o -o app
jednak to, co wydaje się być hap Pening polega na tym, że kiedy llvm-link kodu bitowego aplikacji, cała zawartość MyLibrary.bc wydaje się być zawarta w wyniku. W związku z tym ostateczne powiązanie musi rozwiązać odniesienia wykonane przez składniki biblioteki, których faktycznie nie używam.
Co chcę zrobić, to wyodrębnić z MyLibrary.bc tylko pliki kodów bitowych, które moja aplikacja potrzebuje. Widzę, że istnieje program llvm-ar, ale czytając o tym nie mam wrażenia, że pomogłoby to tutaj. Podejrzewałem, że mogę łączyć bibliotekę z llvm-ar zamiast llvm-link, ale nie mogę tego zrozumieć. Mam nadzieję, że wszystko, czego potrzebuję, to trochę wepchnąć :)
Twój krok łączenia nie zawiera żadnych informacji o optymalizacji ani martwym usuwaniu, które należy wykonać. Czy próbowałeś dodać flagę, żeby to zrobić? –
Masz na myśli flagę na linku llvm? Dokumentacja tutaj http://llvm.org/docs/CommandGuide/llvm-link.html nie mówi o żadnej takiej flagie. Próbowałem użyć opcji opt z flagami -dce i -adce, ale nie było efektu (w moim wydaniu). –
Nie, na ostatnim łączu. Martwe zdejmowanie biblioteki nie ma większego sensu. –