Re[11]: Сборка проекта с разными версиями Буста
От: uzhas Ниоткуда  
Дата: 08.06.11 11:05
Оценка: 2 (1)
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>И это, народ, давайте уже завязывать с теоретизированием. Предлагаете какой-то вариант — пишите пример.
у меня нет возможности. у меня цигвин и я сделал такой вариант:
  build_all.bat
g++ -c -fPIC *.cpp
ld -shared -o boost.1.so boost.1.o
ld -shared -o boost.2.so boost.2.o
ld -shared -o mystuff.boost.1.so mystuff.o -L. -l:boost.1.so
g++ -o prog prog.o -L. -l:mystuff.boost.1.so -l:boost.2.so


  результат
E:\test>prog.exe
hi!
exe boost version == 2
mystuff boost version == 11

я верю в вас, вы на пути к победе
Re: Сборка проекта с разными версиями Буста
От: andrey.desman  
Дата: 08.06.11 13:53
Оценка: 2 (1)
Здравствуйте, Mazay, Вы писали:

M>С компиляцией проблем очевидно нет. Вопрос как организовать линковку и какие баги могут вылезти в рантайме?


Можно пересобрать бусты и библиотеку с информацией о версии и линковать к конкретным версиям:
http://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html

Можно вкомпилить буст в твою .so, ограничить экспорт (например, ключом -export-symbols-regex) и указать -Bsymbolic, чтобы имена буста резолвились из самой .so.
Re[2]: Сборка проекта с разными версиями Буста
От: MasterZiv СССР  
Дата: 08.06.11 14:05
Оценка:
On 08.06.2011 17:53, andrey.desman wrote:

Можно пересобрать бусты и библиотеку с информацией о версии и линковать к
конкретным версиям:

— может лучше это, попроще как-то ? Версию буста поднять просто на
одной из проектов ? Не думаю, что бусты так уж несовместимы.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Сборка проекта с разными версиями Буста
От: andrey.desman  
Дата: 08.06.11 14:38
Оценка: +1 :)
Здравствуйте, MasterZiv, Вы писали:

MZ>- может лучше это, попроще как-то ? Версию буста поднять просто на

MZ>одной из проектов ? Не думаю, что бусты так уж несовместимы.

Кэп здесь уже выступал.
Re: Сборка проекта с разными версиями Буста
От: jazzer Россия Skype: enerjazzer
Дата: 09.06.11 10:53
Оценка:
Здравствуйте, Mazay, Вы писали:

M>С компиляцией проблем очевидно нет. Вопрос как организовать линковку и какие баги могут вылезти в рантайме?


Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет.
Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Сборка проекта с разными версиями Буста
От: andrey.desman  
Дата: 09.06.11 12:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет.

J>Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.

Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.

desman ~ 
$ cat test1.cpp

#include <iostream>

void foo()
{
    std::cout << "test1" << std::endl;
}

desman ~ 
$ cat test2.cpp

#include <iostream>

void foo()
{
    std::cout << "test2" << std::endl;
}

desman ~ 
$ cat lib.cpp

extern void foo();

void bar()
{
    foo();
}

desman ~ 
$ cat test.cpp

#include <limits.h>
#include <iostream>

extern void foo();
extern void bar();

int main()
{
    // foo из исполняемого файла (test2.cpp)
    foo();

    // функция библиотеки, должна вызвать foo из библиотеки (test1.cpp)
    bar();
}

desman ~ 
$ g++ -shared -Wl,-soname,libtest.so -o libtest.so lib.cpp test1.cpp

desman ~ 
$ g++ -L. test.cpp test2.cpp -l:libtest.so

desman ~ 
$ LD_LIBRARY_PATH=. ./a.out
test2
test2


Таки ой.
Re[3]: Сборка проекта с разными версиями Буста
От: andrey.desman  
Дата: 09.06.11 12:46
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.


Про Symbol lookup.
http://download.oracle.com/docs/cd/E19082-01/819-0690/chapter3-13/index.html
Re[3]: Сборка проекта с разными версиями Буста
От: jazzer Россия Skype: enerjazzer
Дата: 09.06.11 13:46
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Здравствуйте, jazzer, Вы писали:


J>>Как насчет того, чтобы собрать твой буст статически и линковать с ним? Тогда точно ничего наружу смотреть не будет.

J>>Т.е. когда собираешь буст, зови bjam c link=static,shared — он соберет и то, и другое, а ты у себя слинкуешься со статическим.

AD>Проблема даже не в том, что что-то из сошки торчит наружу, а в том, что торчит наружу буст из исполняемого файла (или из другой сошки, загруженной ранее). А тут кто раньше загрузился, того и тапки. То есть окажется, что твоя библиотека будет связана с бустом из исполняемого файла.


Ну так если слинковать библиотеку со статическим бустом — проблема же изчезнет?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Сборка проекта с разными версиями Буста
От: andrey.desman  
Дата: 09.06.11 15:31
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну так если слинковать библиотеку со статическим бустом — проблема же изчезнет?


Нет, это же видно из моего примера. При создании .so никакого связывания не делается, все на этапе загрузки, а потому не важно как прилинковать буст. При этом, даже если ты используешь header-only boost, то все, что не заинлайнилось тоже будет связываться, и торчать наружу из .so тоже будет. Поэтому запросто можно передать объект из одной версии в метод из другой.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.