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

Ошибка связи для встроенных функций

Я пытаюсь скомпилировать образец кода "SonofGrab" с помощью XCode 4.5.1 на OS X 10.8.

Одна функция определяется как это в контроллере .m

inline uint32_t ChangeBits(uint32_t currentBits, uint32_t flagsToChange, BOOL setFlags);

Это приведет к появлению этого сообщения об ошибке:

Undefined symbols for architecture x86_64:
"_ChangeBits", referenced from:
-[Controller awakeFromNib] in Controller.o
[...]
ld: symbol(s) not found for architecture x86_64

Удаление встроенной функции ChangeBits решает проблему, но почему компоновщик не находит Changebits с исходным определением?

4b9b3361

Ответ 1

Это для меня похоже на ошибку. Этот простой случай показывает ту же ошибку:

inline void foo() {}
int main() {
    foo();
}

Урожайность:

$ clang test-inline.c
Undefined symbols for architecture x86_64:
  "_foo", referenced from:
      _main in test-inline-MfUY0X.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Это должно быть неправильно!? Если я вообще не пропущу что-то о inline.

Изменить: О нет, подождите, проверьте это - http://clang.llvm.org/compatibility.html#inline

В принципе, я тоже не понял inline. И ни один человек не написал этот образец кода в Apple!

inline в функции ChangeBits означает, что это определение должно использоваться только для inline. Не то, чтобы функция всегда была встроена. Должно быть другое, не встроенное определение, доступное в другом месте приложения, в противном случае оно является незаконным. Следовательно, ошибка связи, так как отсутствует не встроенный ChangeBits.

Реальное решение состоит в том, чтобы объявить ChangeBits как static inline, поскольку это говорит компилятору, что определение является локальным только для этой единицы перевода, и поэтому не обязательно должно быть нестрочное определение.

Более подробную информацию о странице LLVM, с которой я связан, есть. Надеюсь, что это поможет!