Когда использовать определенные оптимизации, такие как -fwhole-program и -fprofile-generate с несколькими разделяемыми библиотеками

Вероятно, простой ответ; Я немного смущен языком, используемым в документации GCC для некоторых из этих флагов!

Во всяком случае, у меня есть три библиотеки и программа, которая использует все эти три. Я собираю каждую из моих библиотек отдельно с отдельными (потенциально) различными наборами предупреждающих флагов. Однако я компилирую все три библиотеки с тем же набором флагов оптимизации.

Затем я компилирую свою основную программу, связывающую эти три библиотеки с собственным набором предупреждающих флагов и теми же самыми флажками оптимизации, которые использовались во время компиляции библиотек.

1) Нужно ли мне компилировать библиотеки с флагами оптимизации или я могу просто использовать эти флаги при компиляции окончательной программы и связывании с библиотеками? Если последний, то будет ли он оптимизировать все или только некоторые (предположительно, что называется) кода в этих библиотеках?

2) Я хотел бы использовать -fwhole-program -flto -fuse-linker-plugin и плагин-плагин-плагин. На каком этапе я компилирую с ними... только окончательная компиляция или эти флаги должны присутствовать во время компиляции библиотек?

3) В значительной степени то же самое, что и 2), однако, с -fprofile-generate -fprofile-arcs и -fprofile-use. Я понимаю, что сначала запускается программа с генерации, а затем с использованием. Однако мне нужно скомпилировать каждую из библиотек с помощью генерации/использования и т.д. Или только для окончательной программы? И если это только последняя программа, когда я затем компилирую с использованием -fprofile, она также оптимизирует функциональность библиотек?

Ответ 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. Эти флаги должны быть указаны в файле исходного кода, чтобы оптимизировать весь код.

Обратите внимание, что если у вас нет исходного кода, вы все равно можете связать статические или динамические библиотеки, которые не были оптимизированы с одинаковыми флагами, и код будет работать. То есть вы можете комбинировать код, оптимизированный на разных уровнях.