M>%g++ -c -fPIC *.cpp // Компилируем всё. M>%ld -shared -o boost.1.so boost.1.o // Сборка динамического буста версии 1. M>%ld -shared -o boost.2.so boost.2.o // Сборка динамического буста версии 2. M>// Простая сборка библиотеки mystuff, типа заточеной под boost.1. M>// Вариант 1. При сборке mystuff.boost.1.so библиотек не указываем вообще.
не интересен M>// Вариант 2. При сборке mystuff.boost.1.so указываем boost.1.so. M>%ld -shared -o mystuff.boost.1.so mystuff.o -L. -l:boost.1.so M>%nm mystuff.boost.1.so M>00000000002002b8 a _DYNAMIC M>00000000002003b8 a _GLOBAL_OFFSET_TABLE_ M> U _Z5foostv // Здесь без изменений.
мне кажется, что вы не пересобрали бинарь. удалите старый (можно все obj + so удалить) M>// Собираем нашу программу. M>%g++ -o prog prog.o -L. -l:mystuff.boost.1.so M>/usr/bin/ld: prog.o: undefined reference to symbol 'foost()' // Хм. Почему-то boost.1.so из mystuff.boost.1.so не подхватилась.
и правильно, что не подхватилось. ссылки же прозрачно не прокидываются. надо указать явно тот буст, который требуется для бинаря
M>// Пробуем указать boost.2.so явно, а boost.1.so для mystuff.boost.1.so пусть сам ищет (должен найти судя по выводу ldd mystuff.boost.1.so): M>%g++ -o prog prog.o -L. -l:mystuff.boost.1.so -l:boost.2.so M>%./prog M>hi! M>exe boost version == 2 // Здесь всё ОК. Экзешник работает с boost.2 M>mystuff boost version == 12 // Опаньки! Косяк! И клал он большой и толстый на то, M> // что в mystuff.boost.1.so захардкожено имя ./boost.1.so
косяка не должно быть M>И это, народ, давайте уже завязывать с теоретизированием. Предлагаете какой-то вариант — пишите пример.
у меня нет возможности. у меня цигвин и я сделал такой вариант:
Можно вкомпилить буст в твою .so, ограничить экспорт (например, ключом -export-symbols-regex) и указать -Bsymbolic, чтобы имена буста резолвились из самой .so.
Здравствуйте, MasterZiv, Вы писали:
MZ>- может лучше это, попроще как-то ? Версию буста поднять просто на MZ>одной из проектов ? Не думаю, что бусты так уж несовместимы.
Здравствуйте, Mazay, Вы писали:
M>С компиляцией проблем очевидно нет. Вопрос как организовать линковку и какие баги могут вылезти в рантайме?
Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет.
Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.
Здравствуйте, jazzer, Вы писали:
J>Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет. J>Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.
Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.
Здравствуйте, andrey.desman, Вы писали:
AD>Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, jazzer, Вы писали:
J>>Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет. J>>Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.
AD>Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.
Ну так если слинковать библиотеку со статическим бустом — проблема же изчезнет?
Здравствуйте, jazzer, Вы писали:
J>Ну так если слинковать библиотеку со статическим бустом — проблема же изчезнет?
Нет, это же видно из моего примера. При создании .so никакого связывания не делается, все на этапе загрузки, а потому не важно как прилинковать буст. При этом, даже если ты используешь header-only boost, то все, что не заинлайнилось тоже будет связываться, и торчать наружу из .so тоже будет. Поэтому запросто можно передать объект из одной версии в метод из другой.