Если вы компилируете в объектные файлы (не исполняемые файлы), то компилятор никогда не удалит никакие не-static
функции, поскольку всегда возможно связать объектный файл с другим объектным файлом, который будет вызывать эту функцию. Таким образом, ваш первый шаг должен объявить как можно больше функций static
.
Во-вторых, единственный способ для компилятора удалить любые неиспользуемые функции - это статически связать ваш исполняемый файл. В этом случае, по крайней мере, существует вероятность того, что программа может прийти и выяснить, какие функции используются, а какие не используются.
Суть в том, что я не верю, что gcc на самом деле выполняет этот тип кросс-модульной оптимизации. Лучше всего ставить флаг -Os
для оптимизации размера кода, но даже в этом случае, если у вас есть объектный файл abc.o, в котором есть неиспользуемые нестатические функции, и вы статически связываетесь с некоторым исполняемым файлом def.exe, я Я не верю, что gcc откажется от кода для неиспользуемых функций.
Если вы действительно отчаянно нуждаетесь в этом, я думаю, вам, возможно, придется на самом деле #include
объединить файлы, чтобы после прохождения препроцессора это привело к компиляции одного файла .c. С gcc, компилирующим один чудовищный jumbo исходный файл, у вас больше шансов на удаление неиспользуемых функций.