Подтвердить что ты не робот

Undefined ссылка при вызове встроенной функции

Я получаю очень странную ошибку от GCC 4.8.1 с встроенными функциями.

У меня есть две почти одинаковые встроенные функции, определенные в файлах заголовков (debug.h и error.h) в src/include/, с той лишь разницей, что они печатаются - один префикс DEBUG: для сообщения, а другой %s: error: %s (название программы, сообщение об ошибке). При определении функций как встроенных, так и компиляции отладочной сборки (поэтому она устанавливает макрос DEBUG=1), я получаю много ошибок undefined:

src/main_debug.o
  gcc -osrc/main_debug.o src/main.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 -DBTCWATCH_VERSION="\"0.0.1\""

src/lib/btcapi_debug.o
  gcc -osrc/lib/btcapi_debug.o src/lib/btcapi.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1

src/lib/libbtcapi_debug.a
  ar rc src/lib/libbtcapi_debug.a src/lib/btcapi_debug.o
  ranlib src/lib/libbtcapi_debug.a

src/lib/cmdlineutils_debug.o
  gcc -o src/lib/cmdlineutils_debug.o src/lib/cmdlineutils.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1

src/lib/libcmdlineutils_debug.a
  ar rc src/lib/libcmdlineutils_debug.a src/lib/cmdlineutils_debug.o
  ranlib src/lib/libcmdlineutils_debug.a

debug
  gcc -obtcwatch-debug src/main_debug.o -Lsrc/lib/ -lbtcapi_debug -lcmdlineutils_debug -lcurl  -ljansson 
src/main_debug.o: In function `main':
/home/marcoms/btcwatch/src/main.c:148: undefined reference to `debug'
src/main_debug.o:/home/marcoms/btcwatch/src/main.c:185: more undefined references to `debug' follow
collect2: error: ld returned 1 exit status
make: *** [debug] Error 1

Но изменение debug() определения на static inline устраняет ошибки. Но я никогда не получал ошибок из определения error(), хотя его defenition inline, а не static inline.

Определения все в заголовках (т.е. не прототипированы)

4b9b3361

Ответ 1

В соответствии с руководство, передача -std=gnu11 включает C99 вместо встроенной семантики GNU.

Это означает, что inline, static inline и extern inline все ведут себя по-разному. В частности, inline ожидает внешнего определения в отдельной единице перевода (которую вы можете предоставить без дублирования определения - см. этот ответ).