2012-03-06 3 views
5

Я использую библиотеку Boost на OS X с помощью Xcode. Boost был установлен в моей системе с использованием macports. Я успешно создал свое приложение, добавив 3 библиотеки ускорения, которые мне нужны (например, libboost_thread-mt.a) в список целевых ссылок Link Binary With Libraries. Однако мне нужно связать эти библиотеки статически, чтобы приложение работало на других компьютерах, не требуя установки библиотеки ускорений.Boost library static linking на Xcode 4

Как мне это сделать? Благодаря моим многочисленным поисковым запросам Google, мне кажется, мне нужно добавить «-статический» - где я могу добавить это в Xcode?

ответ

7

Если вы связались с библиотекой .a, вы уже связали статически. Вам не нужно отправлять .a библиотеки. Это просто пучки объектов.


EDIT: Ваша ошибка наводит на мысль, что вы ссылаетесь на dylib, а не .a. Если у вас есть libfoo.dylib и libfoo.a в вашем пути к библиотеке, даже если вы скажете «link libfoo.a» в Xcode, и даже если libfoo.a ранее на пути поиска, он по-прежнему свяжет libfoo.dylib. Это связано с тем, что соединение Xcode полностью сломано и передает -lfoo компоновщику (вы никогда не должны использовать -l для чего-то, что вы создали и имеете точный путь). Я всегда рекомендую связывать библиотеки, которые вы создали в файле LDFLAGS, в файле xcconfig, а не с помощью панели построения. Вы передаете точный путь, который хотите, а не используете -l. См. Abandoning the Build Panel для моих размышлений о xcconfig. Теперь он устарел, поскольку он был написан для Xcode3, но основы все еще применяются.

Используя панель построения, вы также можете передать весь путь к библиотеке в разделе «Другие флаги компоновщика». Но это все еще имеет проблемы с панелью построения.

Более быстрое (но менее надежное) решение иногда добавляет -Wl,-search_paths_first в раздел «Другие флаги компоновщика». Это изменяет поведение, так что каждый путь библиотеки ищет как .dylib, так и .a перед тем, как продолжить (поведение по умолчанию - это поиск по всему миру за .dylib и только затем поиск .a). Поэтому, если ваш .a находится в другом каталоге от вашего .dylib, и этот каталог находится ранее в пути поиска, это будет работать.

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

+0

Это то, что я думал, хотя при попытке запустить приложение на другом компьютере приложение не запускается и появляется ошибка, говорящая о том, что он не может найти соответствующий .dylib-файл. Должны ли файлы .a быть связаны с проектом где-то еще, кроме как в разделе «Связывание с библиотеками»? –

+0

«Используя панель построения, вы также можете передать весь путь в библиотеку в« Другие флаги компоновщика ». Это решило проблему. Спасибо! –