У меня есть проект на С++, который использует библиотеку С++, которую я также написал. Я использую clang++ 3.3 для создания всего. Каждый файл в библиотеке скомпилирован как
clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc
Затем я использую llvm-link для объединения всех файлов библиотеки *.bc в один файл с битным кодом, например
llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc
Я концептуализую это похоже на создание архива объектных файлов, но я не думаю, что это правда, основываясь на действиях.
Затем я компилирую исходные файлы моего проекта, используя аналогичную команду, приведенную выше. Затем я использую llvm-link (снова), чтобы объединить их вместе с файлом битового кода библиотеки в один файл с битным кодом, подобным этому
llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc
Далее я компилирую app.bc1 в собственный файл объекта
llc -filetype=obj app.bc1 -o app.o
Наконец, я снова использую clang++, чтобы связать этот собственный файл объекта (и с другими родными библиотеками, которые мне нужны, например, стандартная библиотека С++ и т.д.)
clang++ app.o -o app
Однако, похоже, что происходит, когда я llvm-связываю код приложения, все содержимое MyLibrary.bc, кажется, включено в результат. Таким образом, конечная ссылка должна разрешать ссылки, сделанные библиотечными компонентами, которые я фактически не использую.
Что бы я хотел сделать, так это извлечь из MyLibrary.bc только файлы битового кода, которые мне нужны. Я вижу, что есть программа llvm-ar, но, читая об этом, у меня не создается впечатление, что это поможет здесь. Я предположил, что могу объединить библиотеку с llvm-ar вместо llvm-link, но я не могу понять это. Я надеюсь, что все, что мне нужно, это немного толчок:)