Ключевое слово inline
действительно сбивает с толку, хотя для этого варианта использования все еще ясно, если вы знаете значение.
inline
влияет на требования кода, который должен быть сгенерирован.Более конкретно, он сообщает вашему компилятору, что он не должен предвидеть указатель на функцию для этой функции.Как всегда, разрешено копировать содержимое в вызывающую сторону.Из-за встроенного, оригинальная функция не должна быть создана.Таким образом, у вас нет указателя на функцию в test.o.
В main.o вы вызываете эту функцию.Поэтому он пытается разрешить указатель функции, который не был создан, что вызывает ошибку компоновщика.
Нахождение этих случаев может быть сделано, например, с помощью предупреждения компилятора clang: -Wundefined-inline
РЕДАКТИРОВАТЬ
Будет ли встроенная функция не иметь указатель функции?Нет, вы можете отлично взять адрес этой функции, использовать его и передать.Хотя из-за встроенного символа функции вы не можете полагаться на этот указатель функции, сравнивающий равный по сравнению с другим адресом той же функции.
В этом случае у вас где-то будет указатель на функцию в вашем объектефайл.Однако в этом случае компилятору не требуется указывать правильное искаженное имя, чтобы его можно было использовать из другого модуля компиляции.