В общем, если вы хотите, чтобы функция была включена в конечную библиотеку / исполняемый файл, она должна быть:
- используется
- без встраиваемой
И inlined
функция - это функция, код которой просто копируется и вставляется в том месте, где функция используется (компилятором), чтобы не было вызова функции. Это оптимизация возможностей, поэтому функция может быть встроенной в некоторых местах и не встроенной в других, в зависимости от контекста. Большинство очень коротких функций (так называемые однострочные) обычно встроены.
В древние времена, чтобы быть встроенным, в текущей единице перевода необходимо было определить функцию, то есть:
- либо он определен в заголовке (как в вашем случае), и, следовательно, может быть встроен во все источники, включая этот заголовок
- либо он определен в исходном файле, и, следовательно, может быть встроен в этот исходный файл
В настоящее время у нас также есть LTO (Link Time Optimization), и, если он активирован, компоновщик может фактически вызывать вызовы функций. Эти оптимизации также ответственны за очистку результирующей библиотеки / двоичного файла от неиспользованных символов.
Существует два возможных решения вашей проблемы:
- вместо этого определите функцию в исходном файле, она стандартна и не может быть уничтожена
- использовать специальные атрибуты компилятора, чтобы пометить функцию как использованную, чтобы она не была уничтожена
В последнем случае, если вы хотите переносимости, я могу только посоветовать использовать макрос (ATTRIBUTE_USED
) и определить его содержимое в зависимости от текущего используемого компилятора.