Повысьте статическую связь библиотеки на Xcode 4 - PullRequest
5 голосов
/ 06 марта 2012

Я использую библиотеку Boost на OS X, используя Xcode. Boost был установлен в моей системе с использованием macports. Я успешно скомпилировал свое приложение, добавив 3 нужные мне библиотеки надстроек (например, libboost_thread-mt.a) в этот список «Связать двоичные файлы с библиотеками». Однако мне нужно связать эти библиотеки статически, чтобы приложение работало на других компьютерах без необходимости установки библиотеки boost.

Как мне это сделать? Через мои многочисленные поиски в Google я нахожу, что мне может понадобиться добавить '-static' - где я могу добавить это в XCode?

1 Ответ

7 голосов
/ 06 марта 2012

Если вы связались с библиотекой .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, и этот каталог находится ранее в пути поиска, это будет работать.

Этот вопрос, наконец, заставил меня открыть радар на этом, что я должен был сделать много лет назад.Я рекомендую, чтобы другие открыли дубликаты .

...