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

Цель C: встроенная функция - символ не найден

У меня есть библиотека, которая использует встроенную функцию C, и компилируется просто отлично. Когда другая библиотека ссылается на эту библиотеку, она все еще компилируется в порядке. Но если фактическое приложение ссылается на библиотеку, оно не скомпилируется, говоря, что имя _functionNameHere (да, имя функции, начинающееся с подчеркивания) - символ не найден.

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

Любые идеи относительно того, почему это?

Я знаю много о компиляторах, но новичок в Objective-C, и все, что я знаю об этом, - не что иное, как просвещенные догадки. И даже таким образом я не могу думать о причине, что он будет вести себя таким образом.

Дело в том, что встроенная функция INLINE, что означает, что никакого символа вообще нет, он скомпилирован внутри строки, где бы он ни назывался, и приложение-ссылка не должно даже знать, что оно когда-либо существовало. Это правда, если встроенная функция всегда встроена в систему и является частной для библиотеки, и нет специальной конфигурации компилятора, которая предотвращает inlining, и все они верны.

Итак, кто угодно, приходите и укажите пальцем на то, что я делаю/думая неправильно...

Спасибо: -)

4b9b3361

Ответ 1

Вы должны добавить статический спецификатор к определению встроенной функции, если функция предназначена для использования только в той же самой системе перевода (внутренняя связь),

static inline int add(int x, int y) {return x+y;}
int s = add(1, 2);

Если вы опускаете статику в приведенном выше примере (в конфигурации Debug, где не выполняется оптимизация и не выполняется встраивание), компоновщик выйдет с ошибкой, на которую ссылается _add, но символы не найдены.

В C99 объявление встроенной функции без какого-либо спецификатора хранилища не будет генерировать фактическое вызываемое тело функции, чтобы компоновщик выдавал ошибку, когда ему это нужно.

Если ваша встроенная функция может использоваться другими модулями, это сложнее. Общей практикой является включение определения встроенной функции (без extern) в файл заголовка и включение  ровно одно объявление прототипа с extern в одном модуле.

Хорошая статья, объясняющая встроенные функции на C99: http://www.drdobbs.com/184401540

Ответ 2

просто добавьте FOUNDATION_EXPORT для работы в заголовке (.h). Помните import Foundation/Foundation.h(OS X) или UIKit/UIKit.h(ios).

Пример:

//.h
#import <UIKit/UIKit.h>

FOUNDATION_EXPORT inline NSString * myInlineFunction(void);