Использование разделяемых и статических библиотек Linux C++ в одной программе

Как я могу использовать как общие, так и статические библиотеки C++ в одной программе Linux?

При управлении с помощью g++ я пытался расположить команду -static впереди и позади библиотек, которые я не хочу связывать статически, но безрезультатно. с ld по g++ жалуется на то, где находятся файлы .a общих библиотек (ошибка не удается найти -lwhatever).

EDIT: проблема не в ошибке cannot find -lwhatever, так как это просто происходит из-за отсутствия статической версии указанной библиотеки. Я пытаюсь указать, какие библиотеки должны быть связаны статически, а какие — динамически.


person AxeEffect    schedule 02.03.2012    source источник


Ответы (2)


Предполагая, что статический libfoo.a и динамический libbar.so вы могли бы использовать

g++ -o prog main.o other.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar

Вам следует избегать вызова функций в статической библиотеке из динамической; это было бы некрасиво.

намекать

Опции -Wl для g++ используются для передачи аргументов компоновщику ld, вызванному g++.

Вы можете использовать g++ -v, чтобы понять, как g++ вызывает ld, и вы также можете использовать g++ -v -Wl,--verbose, чтобы попросить ld быть подробным.

person Basile Starynkevitch    schedule 02.03.2012
comment
Итак, вы заставляете его искать статическую или динамическую версию какой-либо библиотеки. Но если у вас есть только статическая версия foo и динамическая версия bar. Вам действительно нужно указать статический/динамический?? - person jpyllman; 03.03.2012
comment
Я думаю, что ваш ответ решает проблему. Когда я использую ваши параметры, он выглядит ld, принимает их, но дальше я получаю ошибку cannot find -lgcc_s. Затем я добавляю флаг -static-libgcc и получаю ошибку dynamic STT_GNU_IFUNC symbol strcmp с равенством указателей в /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/libc .a(strcmp.o)' нельзя использовать при создании исполняемого файла; перекомпилировать с -fPIE и повторно связать с -pie` Есть предложения? Я расследую это. - person AxeEffect; 03.03.2012
comment
Упс, в данном случае я думаю, что -Bstatic и -Bdynamic не действуют, эти команды предназначены только для VxWorks: gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/VxWorks-Options.html. В моем проекте ничего не происходит ни с ними, ни без них. - person AxeEffect; 03.03.2012
comment
Я написал -Wl,-Bstatic, который передает -Bstatic в ld, поэтому должен иметь некоторый эффект (и также работает на x86). Используйте g++ -v, чтобы понять, как ld управляется gcc, и используйте g++ -v -Wl,--verbose, чтобы понять, что делает ld. - person Basile Starynkevitch; 03.03.2012
comment
Спасибо Василий, вы были абсолютно правы. Мой вопрос был слишком новичком. Но ваш отзыв был очень полезен для меня. :) - person AxeEffect; 22.03.2012

Вам не нужно указывать -static или -dynamic. Формат файла, на который вы ссылаетесь, указывает, является ли это общей или статической ссылкой. Вам просто нужно выбрать правильный файл для ссылки.

person jpyllman    schedule 02.03.2012
comment
Хорошо, я читаю немного слишком быстро, вы имеете в виду как статический, так и общий libstdc++ ?? - person jpyllman; 03.03.2012