Подтвердить что ты не робот

OSX: Как преобразовать статическую библиотеку в динамическую?

Предположим, у меня есть сторонняя библиотека под названием somelib.a на Mac, на которой работает Mountain Lion с установленным Xcode 4.4. Я хочу получить из него динамическую библиотеку, называемую somelib.dylib. Соответствующей командой Linux будет:

g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.so

где -all-archive и -no-whole-archive передаются в компоновщик. Когда я делаю эквивалент для Mac:

g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.dylib

ld завершается с ошибкой:

ld: unknown option: -whole-archive

Кажется, что ld на OSX отличается от GNU ld. Как мне изменить команду выше, чтобы получить желаемый результат?

Заранее благодарю вас!

4b9b3361

Ответ 1

Я выяснил решение моей проблемы:

g++ -fpic -shared -Wl,-all_load somelib.a -Wl,-noall_load -o somelib.dylib

Необходимыми аргументами являются -all_load и -noall_load.

Ответ 2

В соответствии с руководством ld -noall_load является значением по умолчанию и игнорируется. (Если вы его используете, вы получите сообщение об ошибке: ld: warning: option -noall_load is obsolete and being ignored)

По-видимому, способ обращения -all_load к одной библиотеке выглядит следующим образом:

-Wl,-force_load,somelib.a

Ответ 3

Примечание. Ссылка для документации компоновщика OSX ld.

http://www.unix.com/man-page/osx/1/ld/

Я знаю, что поздно дать ответ для этого, но у меня нет достаточной репутации, чтобы комментировать @hanslovsky ответ. Тем не менее, это помогает мне многое иметь документы из вариантов тоже. Это помогает тем, что параметры делают точно, и что другие опции, которые есть в компоновщике ld. Поэтому я просто хотел поделиться с другими, кто считает, что проблема связана.

UPDATE:

После комментария от @GhostCat я решил расширить свой ответ.

Документы для -all_load:

-all_load

Loads all members of static archive libraries.

Таким образом, он загружается для всех статических библиотек, которые вы заметили. Если вы хотите что-то похожее на --whole-archive и --no-whole-archive, вам нужно использовать -force_load и -noall_load.

-force_load "path_to_archive"

Загружает всех членов указанной библиотеки статического архива. Заметка: -    all_load заставляет всех членов всех архивов загружаться.
   Этот параметр позволяет настроить таргетинг на определенный архив.

-noall_load

Это значение по умолчанию. Этот параметр устарел.

Затем вы можете определить, какие библиотеки будут полностью загружаться с помощью -force_load, а затем снова отключить его с помощью -noall_load.