Ответ 1
Затем я компилирую свою основную программу, связывающую эти три библиотеки с его собственный набор предупреждающих флагов и те же самые флаги оптимизации во время компиляции библиотек.
Здесь есть два шага, а не один. Компиляция основной программы для создания объектного файла - первая, а затем объединение всех вместе для создания исполняемого двоичного файла - это второй шаг.
1) Нужно ли мне компилировать библиотеки с флагами оптимизации или я могу просто использовать эти флаги при компиляции окончательной программы и связь с библиотеками? Если последний, то он будет оптимизировать все или только некоторые (предположительно, что называется) кода в этих библиотеки?
Флаги оптимизации и любые другие флаги уровня компилятора должны быть указаны в файле исходного кода. Каждый раз, когда исходный файл скомпилирован для создания объектного файла, вам нужно указать флаги. Затем создание библиотеки или исполняемого файла выполняется компоновщиком с использованием другого набора флагов для компоновщика.
2) Я хотел бы использовать -fwhole-program -flto -fuse-linker-plugin и линкер плагин золото. На каком этапе я скомпилирую с ними... просто финальная компиляция или эти флаги должны присутствовать во время компиляция библиотек?
Вы должны указать -flto
при компиляции каждого файла исходного кода (или тех, которые доступны вам). Вам не нужно указывать -fuse-linker-plugin
и -fwhole-program
при использовании золотого линкера или GNU ld 2.21 или новее. Для получения дополнительной информации см. документация на -flto
.
3) В значительной степени то же, что и 2), однако, с -fprofile-generate -fprofile-arcs и -fprofile-use. Я понимаю, что сначала запускается программа с генерации, а затем с использованием. Однако я должен компилировать каждую из библиотек с помощью генерации/использования и т.д. или только финальную программа? И если это только последняя программа, когда я компилирую с -fprofile-use будет ли он также оптимизировать функциональность библиотек?
То же, что и 2. Эти флаги должны быть указаны в файле исходного кода, чтобы оптимизировать весь код.
Обратите внимание, что если у вас нет исходного кода, вы все равно можете связать статические или динамические библиотеки, которые не были оптимизированы с одинаковыми флагами, и код будет работать. То есть вы можете комбинировать код, оптимизированный на разных уровнях.