Как я могу заставить GCC компилировать функции, которые не используются? - PullRequest
9 голосов
/ 15 ноября 2010

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

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

Есть ли способ сказать GCC компилировать эти функции, даже если они не вызываются?

Я компилирую с gcc 4.2.2, используя -O2 в SuSE linux (x86-64_linux_2.6.5_ImageSLES9SP3-3).

Ответы [ 4 ]

15 голосов
/ 15 ноября 2010

Вы можете попробовать __attribute__ ((used)) - см. Объявление атрибутов функций в руководстве по gcc.

2 голосов
/ 15 ноября 2010

В вашем вопросе не хватает нескольких деталей, но я попробую ...

GCC обычно удаляет функции в очень немногих случаях:

  • Если они объявлены статическими
  • В некоторых случаях (например, при использовании -fno-Implement-inlines), если они объявлены как inline
  • Любые другие, которые я пропустил

Я предлагаю использовать «nm», чтобы увидеть, какие символы на самом деле экспортируются в результирующие файлы .o, чтобы убедиться, что это действительно проблема, а затем посмотреть на любые случайные «статические» ключевые слова. Не обязательно в этом порядке ...

EDIT:

Кстати, с опциями -Wall или -Wunused-function GCC предупредит о неиспользуемых функциях, которые затем станут основными целями для удаления при оптимизации. Не упустите

предупреждение: ‘xxx’ определено, но не используется

в журналах компиляции.

2 голосов
/ 15 ноября 2010

Будучи прагматиком, я бы просто добавил:

// Hopefully not a name collision :-)
void *xyzzy_plugh_zorkmid_3141592653589_2718281828459[] = {
    &functionToForceIn,
    &anotherFunction
};

на уровне файлов одного из ваших исходных файлов (или даже совершенно нового исходного файла, что-то вроде forcedCompiledFunctions.c, поэтомуочевидно, для чего это нужно).

Поскольку это нестатично, компилятор не сможет воспользоваться возможностью, в которой он вам больше не понадобится, поэтому должен скомпилировать его.

1 голос
/ 14 мая 2019

Будьте осторожны, так как -Wunused-functions не предупреждает о неиспользуемых функциях, как указано выше.Он предупреждает о незапущенных функциях STATIC.

Вот что говорит man-страница для gcc:

-Wunused-function Предупредить, когда статическая функция объявлена, но не определена, или неиспользуемая статическая функция не используется.Это предупреждение включено -Wall.

Это было бы более уместно в качестве комментария, но я пока не могу комментировать ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...