Re: как собрать .a библиотеки в so
От: Kemm  
Дата: 20.03.06 21:39
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

Маны читать полезно, как выяснилось. Правильный способ:
ld -shared -o libmylib.so --whole-archive $(STATIC_LIBS} --no-whole-archive ${COMMON_LIBS}


Таким образом из ${STATIC_LIBS} будет создана libmylib.so, к которой обычным образом будут прилинкованы ${COMMON_LIBS}
Re: как собрать .a библиотеки в so
От: RS Земля ICQ: 148844272
Дата: 20.03.06 21:05
Оценка: +1
Здравствуйте, Аноним, Вы писали:

... поскипано...

Вот здесь
Автор: RS
Дата: 15.02.06
я писал, как я это делал. Не уверен, что очень уж универсально.
Компилятор у меня gcc 2.95.4, с 3.3.x тоже работает. Линукс.
Re[2]: как собрать .a библиотеки в so
От: Kemm  
Дата: 20.03.06 21:09
Оценка: +1
Здравствуйте, RS, Вы писали:

RS>Вот здесь
Автор: RS
Дата: 15.02.06
я писал, как я это делал. Не уверен, что очень уж универсально.

RS>Компилятор у меня gcc 2.95.4, с 3.3.x тоже работает. Линукс.

Угу, как вариант, если нужно несколько функций вытащить. Если же целиком переделать — то, имхо, проще разобрать .a и собрать из объектников .so, как выше написал.
как собрать .a библиотеки в so
От: Аноним  
Дата: 20.03.06 20:02
Оценка:
Сабж?

Есть модуль, который состоит из нескольких подмодулей.
Каждый из подмодулей собирается в файлик libXXX.a
Как это все скрутить в одну so библиотеку?

Пока что у меня получается so-шка размером 6кб, которая не содержит ничего из нужных библиотек...
Игрался с разными флагами, но нифига не получилось

макефиле у меня приблизительно такой:


LIB_PARSERS = Lib/libp1.a Lib/libp2.a Lib/libp3.a
DLL_PARSERS = libparsers.so

all: $(LIB_PARSERS)
        g++  -rdynamic -Wl,-export-dynamic -shared -Wl,-soname,Lib/$(DLL_PARSERS) -o Lib/$(DLL_PARSERS) $(LIB_PARSERS)


Подмодули собрались нормально (во всяком случае если их линковать к бинарнику, то все ок)
Кстати, конструкция "-shared -Wl,-soname,Lib/$(DLL_PARSERS)" почему то не подставляет нужное имя без "-o Lib/$(DLL_PARSERS)"
флаг -l<имя> тоже не помогает
пробовал "-Wl,-allextract" (вычитал в соляровском мане) — без толку

Кстати нужно это уметь собирать под солярой и под линуксом (флаги могут быть различные, так что за универсальностью гнаться не обязательно)
Re: как собрать .a библиотеки в so
От: Kemm  
Дата: 20.03.06 20:41
Оценка:
Здравствуйте, Аноним, Вы писали:

Общее направление мыслей:

for i in ${STATIC_LIBS}; do
  ar x $i >> OBJS
done

ld -o ${SHARED_LIB} -shared `cat OBJS`
Re[3]: как собрать .a библиотеки в so
От: RS Земля ICQ: 148844272
Дата: 20.03.06 21:27
Оценка:
Здравствуйте, Kemm, Вы писали:

K>Угу, как вариант, если нужно несколько функций вытащить. Если же целиком переделать — то, имхо, проще разобрать .a и собрать из объектников .so, как выше написал.


Угу. И закономерный вопрос: можно ли сделать то же, что я сделал, но покрасивше?
Re[4]: как собрать .a библиотеки в so
От: Kemm  
Дата: 20.03.06 21:40
Оценка:
Здравствуйте, RS, Вы писали:

RS>Угу. И закономерный вопрос: можно ли сделать то же, что я сделал, но покрасивше?


вот тут покрасивше 8))
Автор: Kemm
Дата: 21.03.06
Re: как собрать .a библиотеки в so
От: Аноним  
Дата: 21.03.06 00:58
Оценка:
ну и конечно же все модули из статическиз библиотек собраны с picом??? -- иначе смысла в этом не дофига... и по хорошему тебе сошку не должны дать собрать
Re[2]: как собрать .a библиотеки в so
От: Аноним  
Дата: 21.03.06 10:35
Оценка:
Здравствуйте, Kemm, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


K>Маны читать полезно, как выяснилось. Правильный способ:

Согласен....
только в манах пока нужное откопаешь... особенно если не знать где искать...
Другое дело МСДН
K>
K>ld -shared -o libmylib.so --whole-archive $(STATIC_LIBS} --no-whole-archive ${COMMON_LIBS}
K>


K>Таким образом из ${STATIC_LIBS} будет создана libmylib.so, к которой обычным образом будут прилинкованы ${COMMON_LIBS}

Спасибо помогло...
еще детально не щупал, но судя по размеру и контенту туда залилось много
Re[3]: как собрать .a библиотеки в so
От: Kemm  
Дата: 21.03.06 10:55
Оценка:
Здравствуйте, Аноним, Вы писали:

K>>Маны читать полезно, как выяснилось. Правильный способ:

А>Согласен....
А>только в манах пока нужное откопаешь... особенно если не знать где искать...

man gcc, далее по ссылкам — куда уж проще.

А>Другое дело МСДН


Бюээ. Извините. Смотрел я на тот ваш msdn, пока нужное нашел — чуть не плюнул на затею спортировать простенький сервер на винду, так бы и собирался цыгвином до сих пор.

PS: Дайте мне права модератора — я сам себя отмодерирую. 8))
Re: как собрать .a библиотеки в so
От: Аноним  
Дата: 21.03.06 18:44
Оценка:
Возвращаясь к проблеме (наконец то руки дошли....)

Итак имеем:

LIB_DIR = <path to libxml2.so.2>
LIB_PARSERS = Lib/libp1.a Lib/libp2.a Lib/libp3.a
DLL_PARSERS = libparsers.so

all: $(LIB_PARSERS)
        g++  -rdynamic -Wl,-export-dynamic -shared -Wl,-soname,Lib/$(DLL_PARSERS) -Wl,--whole-archive -o Lib/$(DLL_PARSERS) $(LIB_PARSERS) -Wl,--no-whole-archive -L$(LIB_DIR) -lxml2 -lantlr


Акцент на 2 последних параметра. Замечу, что libxml2 у меня динамическая библиотека, а libantlr — статическая.
Этот кусок линкуется без ошибок.... НО!!!!

$ nm libp1.a | grep xmlReadFile
         U xmlReadFile

Что в целом логично, т.к. там эта функция запускается

Я еще могу понять это:
$ nm libparsers.so | grep xmlReadFile
         U xmlReadFile

Что в целом тоже логично, так как я пытаюсь линковаться с динамической библиотекой

Но почему когда я пытаюсь слинковать бинарник с libparsers.so (который поидее должен быть слинкован с libxml2.so.2) я имею кучу нерезолвленых символов.

Тоже самое касается символов из libantlr.a

Или даже при линкове своей программы я обязан указывать все библиотеки, от которых зависят библиотеки программы? (во каламбур?)
Re[2]: как собрать .a библиотеки в so
От: Аноним  
Дата: 21.03.06 18:54
Оценка:
А>Но почему когда я пытаюсь слинковать бинарник с libparsers.so (который поидее должен быть слинкован с libxml2.so.2) я имею кучу нерезолвленых символов.

А>Тоже самое касается символов из libantlr.a

Кстати слинковаться с so-шкой у меня получилось выставив перед компиляцией LD_LIBRARY_PATH на директорию с libxml2.so.2....
Только я не могу понять при чем тут это?
Re: как собрать .a библиотеки в so
От: zaufi Земля  
Дата: 21.03.06 21:46
Оценка:
хорошо что у тя все там получилось... но в целом ме не оч понятно очего бы не заюзать autoconf/automake + libtool -- все эти дурацкие проблемы исчезают -- я не представляю себе проекта без этих тулзов в особенности если он (или "... даже если он немного...") сложнее чем Hello World...

... появлябтся другие еси ты не в теме

---

Здравствуйте, Аноним, Вы писали:

А>Сабж?


А>Есть модуль, который состоит из нескольких подмодулей.

А>Каждый из подмодулей собирается в файлик libXXX.a
А>Как это все скрутить в одну so библиотеку?

А>Пока что у меня получается so-шка размером 6кб, которая не содержит ничего из нужных библиотек...

А>Игрался с разными флагами, но нифига не получилось

А>макефиле у меня приблизительно такой:


А>

А>LIB_PARSERS = Lib/libp1.a Lib/libp2.a Lib/libp3.a
А>DLL_PARSERS = libparsers.so

А>all: $(LIB_PARSERS)
А>        g++  -rdynamic -Wl,-export-dynamic -shared -Wl,-soname,Lib/$(DLL_PARSERS) -o Lib/$(DLL_PARSERS) $(LIB_PARSERS)
А>


А>Подмодули собрались нормально (во всяком случае если их линковать к бинарнику, то все ок)

А>Кстати, конструкция "-shared -Wl,-soname,Lib/$(DLL_PARSERS)" почему то не подставляет нужное имя без "-o Lib/$(DLL_PARSERS)"
А>флаг -l<имя> тоже не помогает
А>пробовал "-Wl,-allextract" (вычитал в соляровском мане) — без толку

А>Кстати нужно это уметь собирать под солярой и под линуксом (флаги могут быть различные, так что за универсальностью гнаться не обязательно)
Re[3]: как собрать .a библиотеки в so
От: Kemm  
Дата: 21.03.06 21:47
Оценка:
Здравствуйте, Аноним, Вы писали:


А>>Но почему когда я пытаюсь слинковать бинарник с libparsers.so (который поидее должен быть слинкован с libxml2.so.2) я имею кучу нерезолвленых символов.

А>>Тоже самое касается символов из libantlr.a
А>Кстати слинковаться с so-шкой у меня получилось выставив перед компиляцией LD_LIBRARY_PATH на директорию с libxml2.so.2....
А>Только я не могу понять при чем тут это?

Тема для медитации: ldd libparsers.so что выводит без установленой LD_LIBRARY_PATH и с установленой.
Re[2]: как собрать .a библиотеки в so
От: Kemm  
Дата: 21.03.06 21:49
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>хорошо что у тя все там получилось... но в целом ме не оч понятно очего бы не заюзать autoconf/automake + libtool -- все эти дурацкие проблемы исчезают -- я не представляю себе проекта без этих тулзов в особенности если он (или "... даже если он немного...") сложнее чем Hello World...


Куда там автоконф-то? В исходной задаче вообще не говорилось, что есть исходники статических либ, из которых динамическую сделать нужно. Если есть исходники — очевидно, что проще из них все сразу собрать.
Re[4]: как собрать .a библиотеки в so
От: Аноним  
Дата: 22.03.06 07:26
Оценка:
Здравствуйте, Kemm, Вы писали:
А>>>Но почему когда я пытаюсь слинковать бинарник с libparsers.so (который поидее должен быть слинкован с libxml2.so.2) я имею кучу нерезолвленых символов.
А>>>Тоже самое касается символов из libantlr.a
А>>Кстати слинковаться с so-шкой у меня получилось выставив перед компиляцией LD_LIBRARY_PATH на директорию с libxml2.so.2....
А>>Только я не могу понять при чем тут это?

K>Тема для медитации: ldd libparsers.so что выводит без установленой LD_LIBRARY_PATH и с установленой.

Не, ну понятное дело, что без установленой ldd не находит либхмл....
Я только не пойму почему он смотрит в эту переменуную в момент линковки? Чем ему не нравится ключ -L?
Насколько я понимаю переменная LD_LIBRARY_PATH должна играть рояль только при запуске...
Или я не прав?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.