Неопределенный внешний символ в разделяемой библиотеке - PullRequest
0 голосов
/ 21 сентября 2011

Я недавно запустил nm -m -p -g в библиотеке System.B.dylib из iOS SDK4.3 и был удивлен, обнаружив множество символов, помеченных (undefined) (external).Почему и когда неопределенный символ будет отмечен как внешний?Я могу понять неопределенный внешний символ, помеченный lazy или weak, но это не так.Многие из функций pthread_xxx попадают в эту категорию.Когда я связываюсь с этой библиотекой, все символы разрешаются.Символы pthread_xxx определены в одной из библиотек в папке \usr\lib\system, поэтому я предполагаю, что они удовлетворены оттуда.Как это работает во время ссылки?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Прошло много времени с тех пор, как я был ниндзя с кодировкой nm и ld, но я думаю, что это означает только то, что существуют другие библиотеки, с которыми он связывается.

0 голосов
/ 21 сентября 2011

Обычно так работает динамическое связывание. Если бы вы имели статический архив System.B, вы бы не наблюдали такого поведения. System.B.dylib сам по себе мало что даст; если вы не сделаете это как часть набора динамических и статических библиотек, чьи функции он использует. Если вы сейчас попытаетесь скомпилировать ваш окончательный двоичный файл, НО пропустите путь к библиотеке '/ usr / lib / system', то ваш компоновщик выкрикнет фол и выйдет с ошибкой, сообщив вам, что он не может найти ссылку на pthread_XXX () (используя приведенный выше пример ). Во время окончательной сборки двоичного файла необходимо убедиться, что он знает местоположение каждой и каждой используемой функции.

НТН

...