Если вы связались с библиотекой .a
, значит, вы уже статически связаны.Вам никогда не нужно отправлять .a
библиотеки.Это просто наборы объектов.
РЕДАКТИРОВАТЬ: Ваша ошибка настоятельно предполагает, что вы связываете dylib, а не .a.Если у вас есть libfoo.dylib
и libfoo.a
в пути к вашей библиотеке, даже если вы говорите "link libfoo.a
" в Xcode, и даже если libfoo.a
находится ранее в пути поиска, он все равно будет ссылаться на libfoo.dylib
.Это связано с тем, что ссылки XCode полностью разорваны и передают компоновщик -lfoo
(вы никогда не должны использовать -l
для чего-то, что вы создали и имеете точный путь к нему).Я всегда рекомендую связывать библиотеки, которые вы встроили в LDFLAGS
, в файл xcconfig, а не использовать панель сборки.Вы передаете точный путь, который хотите, а не используете -l
.См. Отказ от панели сборки , чтобы узнать больше о xcconfig.Сейчас он устарел, поскольку он был написан для Xcode3, но основы по-прежнему применимы.
Используя панель сборки, вы также можете передать весь путь к библиотеке в «Другие флаги компоновщика».Но это все еще имеет все проблемы панели сборки.
Более быстрое (но менее надежное) решение иногда заключается в добавлении -Wl,-search_paths_first
к «другим флагам компоновщика».Это меняет поведение так, что в каждом пути к библиотеке выполняется поиск как .dylib
, так и .a
перед продолжением (стандартное поведение - поиск везде 10 * * и только затем поиск .a
).Поэтому, если ваш .a
находится в другом каталоге, чем ваш .dylib
, и этот каталог находится ранее в пути поиска, это будет работать.
Этот вопрос, наконец, заставил меня открыть радар на этом, что я должен был сделать много лет назад.Я рекомендую, чтобы другие открыли дубликаты .