Принудительное статическое связывание библиотеки, связанной с целью XCode? - PullRequest
11 голосов
/ 19 января 2009

Мои целевые ссылки Xcode против библиотеки hdf5 (используя фазу сборки Link Binary with Libraries). libhdf5 устанавливается с использованием MacPorts, поэтому / opt / local / lib содержит как динамическую (.dylib), так и статическую (.a) версии библиотеки.

Вывод текста из сборки показывает, что, как и ожидалось, на этапе компоновки сборки -lhdf5. Однако gcc, похоже, берет динамическую библиотеку поверх статической. Есть ли способ заставить gcc (через переключатель компилятора или через Xcode) статически связать с libhdf5.a?

Единственное решение, которое я нашел, - это скопировать libhdf5.a в каталог проекта (или другой) и связать его с этой копией, чтобы избежать динамических и статических версий в одном месте.

Ответы [ 4 ]

14 голосов
/ 08 ноября 2010

У меня была точно такая же проблема, и, несмотря на то, что это был старый пост, я подумал, что поделюсь тем, что я должен был сделать, чтобы сделать эту работу.

Обычно вы просто предоставляете переключатель '-static' для компоновщика, однако, с Xcode это вызывает статическое связывание всех библиотек, включая crt. Я получил ошибку:

can't locate file for: -lcrt0.o

Когда я попробовал это.

То, что у меня сработало, это заменить:

-lmylib

с

/ путь / к / libmylib.a

Примечание: -l отброшен.

7 голосов
/ 01 февраля 2009

В ответ на ваш комментарий к ответу Эдуарда Вирча: вы также можете контролировать статическое связывание только для этой библиотеки, если вы замените -lhdf5 на -l / full / path / to / libhdf5.a

3 голосов
/ 29 октября 2012

Мой случай с Xcode 4.5:

Когда я перетаскиваю статическую библиотеку C (стороннюю библиотеку, скомпилированную с помощью GNU Autotools) в рамки проекта (Project Navigator > Frameworks), компоновщик, похоже, считает, что это динамическая библиотека, и добавляет -L -l flags:

-L/path/to/libfoodir -lfoo

Сбой связи, потому что /path/to/libfoodir/libfoo.dylib нет. Команду компоновщика можно увидеть из:

Log Navigator > select a Build log > select a Link line and expand it

Связывание завершается успешно, когда я добавляю полный путь (/path/to/libfoodir/libfoo.a) к настройкам компоновщика:

Targets > Build Settings (all) > Other linker flags
2 голосов
/ 20 января 2009

Используйте переключатель "-static" для связывания: Параметры связи GCC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...