Ответ 1
Я выяснил решение моей проблемы:
g++ -fpic -shared -Wl,-all_load somelib.a -Wl,-noall_load -o somelib.dylib
Необходимыми аргументами являются -all_load и -noall_load.
Предположим, у меня есть сторонняя библиотека под названием 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. Как мне изменить команду выше, чтобы получить желаемый результат?
Заранее благодарю вас!
Я выяснил решение моей проблемы:
g++ -fpic -shared -Wl,-all_load somelib.a -Wl,-noall_load -o somelib.dylib
Необходимыми аргументами являются -all_load и -noall_load.
В соответствии с руководством ld
-noall_load
является значением по умолчанию и игнорируется. (Если вы его используете, вы получите сообщение об ошибке: ld: warning: option -noall_load is obsolete and being ignored
)
По-видимому, способ обращения -all_load
к одной библиотеке выглядит следующим образом:
-Wl,-force_load,somelib.a
Примечание. Ссылка для документации компоновщика OSX ld
.
http://www.unix.com/man-page/osx/1/ld/
Я знаю, что поздно дать ответ для этого, но у меня нет достаточной репутации, чтобы комментировать @hanslovsky ответ.
Тем не менее, это помогает мне многое иметь документы из вариантов тоже.
Это помогает тем, что параметры делают точно, и что другие опции, которые есть в компоновщике ld
.
Поэтому я просто хотел поделиться с другими, кто считает, что проблема связана.
После комментария от @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
.