Я участвую в одном проекте с открытым исходным кодом под названием AMX Mod X. В нем используется действительно простая, специально разработанная система сборки (называемая AMBuild).Проект построен с использованием Clang в Linux.
Я попытался включить LTO для него, просто передав аргументы времени компиляции и времени компоновки.
В качестве аргументов времени компоновки я добавил
-O2 -flto=thin -fuse-ld=lld -Wl,-z,notext
И в качестве аргументов во время компиляции.
-O2 -flto=thin -fPIC
Я выбрал эту конфигурацию после тщательного поиска в Google.Кажется, я очень близок к достижению полного LTO.Не удается собрать только один модуль, он связывается с pcre.
Сгенерированная (системой сборки) команда связывания выглядит следующим образом.
clang-4.0 _public_sdk_amxxmodule.o module.o CRegEx.o utils.o -m32 -O2 -flto=thin -fuse-ld=lld -Wl,-z,notext -ldl -lm -lgcc_eh ../../../support/versionlib/version/libversion.a /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a -shared -o regex_amxx_i386.so
И ошибок связывания много, но они очень похожи,Это одна из них.
/usr/lib/llvm-4.0/bin/ld.lld: error: pcre_compile.c:(function add_to_class): can't create dynamic relocation R_386_32 against symbol '_pcre_ucd_stage1' defined in /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a(libpcre_la-pcre_ucd.o)
Я прочитал , что LLD и bfd имеют разные значения по умолчанию и -Wl,-z,notext
должны работать, но это не имело никакого эффекта.
libpcre.a - это просто двоичный файл в комплекте с репозиторием.AMBuild не создает pcre из источников.Это мой PR , вы можете найти там неудачную сборку travis и более внимательно читать логи.Не бойтесь настраиваемой системы сборки, все выполненные команды выводятся на терминал в максимально подробной форме.Это не должно быть проблемой.
Как включить LTO при связывании с pcre?Меня не волнуют другие компиляторы (gcc, icc и т. Д.) Или другие операционные системы.
UPD : LTO означает L чернила T время O оптимизация