Форсировать статическое связывание библиотеки, связанной с целью Xcode?

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

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

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

Ответ 1

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

Ответ 2

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

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

can't locate file for: -lcrt0.o

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

Вещь, которая работала для меня, заключалась в замене:

-lmylib

с

/path/to/libmylib.a

Примечание: значение -l отбрасывается.

Ответ 3

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

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

-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