Ответ 1
В ответ на ваш комментарий к Eduard Wirch: вы также можете управлять статическим связыванием только для этой библиотеки, если вы замените -lhdf5 на -l/full/path/to/libhdf5.a
Мои целевые ссылки Xcode против библиотеки hdf5 (с использованием фазы компоновки ссылок с базой данных). libhdf5 устанавливается с использованием MacPorts, поэтому /opt/local/lib содержит как динамические (.dylib), так и статические (.a) версии библиотеки.
Текстовый вывод из сборки показывает, что на этапе компоновки сборки есть, как и ожидалось, -lhdf5
. Однако gcc, похоже, использует динамическую связанную библиотеку поверх статики. Есть ли способ заставить gcc (через коммутатор компилятора или через Xcode) статически ссылаться на libhdf5.a?
Единственное решение, которое я нашел, - это скопировать libhdf5.a в проект (или другой) каталог и ссылку на эту копию, что позволяет избежать динамических и статических версий в том же месте.
В ответ на ваш комментарий к Eduard Wirch: вы также можете управлять статическим связыванием только для этой библиотеки, если вы замените -lhdf5 на -l/full/path/to/libhdf5.a
Если бы эта точно такая же проблема, и, несмотря на то, что это был старый пост, я думал, что поделюсь тем, что должен был сделать, чтобы сделать эту работу.
Обычно вы просто предоставляете коммутатору '-static' для компоновщика, однако с Xcode это приводит к тому, что все библиотеки, включая crt, должны быть связаны статически. Я получил ошибку:
can't locate file for: -lcrt0.o
Когда я попробовал это.
Вещь, которая работала для меня, заключалась в замене:
-lmylib
с
/path/to/libmylib.a
Примечание: значение -l отбрасывается.
Мой случай с 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
Используйте переключатель "-статический" для соединения: Параметры ссылки GCC