Рассмотрите следующий пример
g++ a.o b.o c.o -o prog
Если это имеет место это c.o
не вносит исполняемого кода в prog
, и при этом нет никаких зависимостей от c.o
в любом из других файлов, будет GCC все же включать содержание c.o
в prog
?
Сказанный иначе, кроме времени компиляции, что (если таковые имеются) негативные последствия могут там иметь компиляцию ненужных файлов в исполняемый файл?
Заранее спасибо; Удачи!
Нет никаких негативных последствий, за исключением того, что ваш исполняемый файл может быть излишне большим. Компоновщик, вероятно, может удалить неиспользуемый код за вас, и это уменьшит количество вещей. Вы можете использовать какой-то инструмент просмотра объектов ( otool
, objdump
, nm
и т. Д.) В выходном исполняемом файле, чтобы увидеть, есть ли в вашей программе дополнительные символы в Это.
Я использую Mac, поэтому будут некоторые различия, если вы используете стандартный набор инструментов gcc, но вот пример:
$ make
gcc -o app main.c file2.c
gcc -Wl,-dead_strip -o app_strip main.c file2.c
$ ls -l app*
-rwxr-xr-x 1 carl staff 8744 Feb 6 20:05 app
-rwxr-xr-x 1 carl staff 8704 Feb 6 20:05 app_strip
Я думаю, что в мире gcc, отличном от Apple, вы бы прошли -Wl, - gc-section
вместо -Wl, -dead_strip
в моем примере. Разница в размерах двух исполняемых файлов, которые вы видите, объясняется удалением дополнительной функции:
$ nm app | cut -c 20- > app.txt
$ nm app_strip | cut -c 20- > app_strip.txt
$ diff app.txt app_strip.txt
8d7
< _function2
Я только что попробовал это с помощью некоторого кода на Си, который я сейчас использую - я связал в объекте, который содержал метод, который (пока) нигде не использовался в программе. Код был включен в результирующий исполняемый файл, который проверялся запуском nm
против elf-файла и заметил, что метод T действительно был там, даже при использовании -O2 и -O3.
llvm
может исключить мертвый код на этапе связывания. Он использует специальный линкер llvm-ld
.
Кроме того, использование -fwhole
или -ipo
(intel) поможет убрать мертвые символы.
Да, GCC включит все объектные файлы. С помощью самого свежего компилятора (версия разработки 4.5.0) для этого можно использовать -flto
(оптимизация во времени компоновки).