gcc 7.4 собирает пример с -O2 и ругается без оптимизации. gcc 4.8 собирает без ругани в обоих случаях. Где порылась собака и какое поведение правильное?
root@0d2ad7bc98a5:/build/src# cat a.c
#include <stdio.h>
inline void f(void)
{
printf("wtf\n");
}
void g(void)
{
f();
}
int main(void)
{
f();
return 0;
}
root@0d2ad7bc98a5:/build/src# gcc a.c
/tmp/ccOKVIbb.o: In function `g':
a.c:(.text+0x5): undefined reference to `f'
/tmp/ccOKVIbb.o: In function `main':
a.c:(.text+0x11): undefined reference to `f'
collect2: error: ld returned 1 exit status
root@0d2ad7bc98a5:/build/src# gcc a.c -O2
root@0d2ad7bc98a5:/build/src# gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Если убрать inline - сборка проходит. То, что компилятор к inline относится по-разному в зависимости от уровня оптимизации, я знаю. Но стулья ломать зачем?