g ++ компоновщик не распознает -Bstatic - PullRequest
7 голосов
/ 18 января 2012

Мой вопрос является расширением этого вопроса

Я хочу связать с 2 библиотеками - foo и bar, предпочитая static для foo и dynamic для bar.Если я использую

g++ -static -lfoo -lbar

, он пытается найти статические архивы для foo и bar.Когда я изменяю команду на

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

согласно приведенному выше SO-вопросу, я получаю эту ошибку:

ld: unknown option: -Bstatic

Обновление: я использую OSX, если это имеет какое-либо значение

Ответы [ 2 ]

6 голосов
/ 18 января 2012

Мы имеем дело с компоновщиком GNU здесь? Можете ли вы показать нам вывод "ld -v"?

EDIT: это не похоже на ld в GNU, поэтому опция -Bstatic не распознается. И кажется, что Apple ld не очень хорошо поддерживает смешивание статических и динамических библиотек; см. это: Смешанная статическая и динамическая связь в Mac OS .

1 голос
/ 17 января 2016

Да, к сожалению, использование OS X имеет значение. -static просит компилятор предоставить вам полностью статически связанный исполняемый файл (не поддерживается в OS X), и, как указал Адиел, -Wl, -Bstatic для смешивания статических и динамических связей не поддерживается компоновщиком clang от Apple. 1002 *

Чтобы обойти эту проблему на Mac, попробуйте:

g++ myapp.cpp libfoo.a libbar.a

в качестве строки компиляции (где имена библиотек следуют за вашим источником в командной строке). Это даст myapp статическую связь с библиотеками foo и bar, тогда как другие необходимые библиотеки будут связаны динамически.

...