Преобразование статической библиотеки в общую библиотеку (создайте libsome.so из libsome.a): где мои символы? - PullRequest
11 голосов
/ 03 февраля 2010

заголовок этого вопроса - точный обман , но ответы на этот вопрос мне не помогают.

У меня есть куча объектных файлов, упакованных в статическую библиотеку:

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp
% ar -rc libsome.a foo.o bar.o

Я бы хотел сгенерировать libsome.so из libsome.a вместо объектных файлов, но библиотека действительно barebones:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a
% nm -DC libsome.so
0000xxxx A _DYNAMIC
0000xxxx A _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
0000xxxx A __bss_start
         w __cxa_finalize
0000xxxx A _edata
0000xxxx A _end
0000xxxx T _fini
0000xxxx T _init

со статической библиотекой все в порядке, или, по крайней мере, я отлично могу связать ее с исполняемым файлом и заставить ее запускать содержащиеся в ней функции. Кроме того, все в порядке, если я создаю libsome.so из foo.o и bar.o.

Ответы [ 2 ]

23 голосов
/ 03 февраля 2010

Предполагая, что вы используете компоновщик GNU, вам нужно указать опцию --whole-archive, чтобы вы могли получить все содержимое статического архива. Поскольку это опция компоновщика, вам потребуется -Wl, чтобы указать gcc передать его компоновщику:

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a

Если вы делали что-то более сложное, когда вам нужна вся библиотека, а только та часть поддержки библиотеки, которая нужна libsome, вы захотите отключить весь архив после того, как используете его в libsome:

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a

Если вы не используете компоновщик GNU, вам необходимо выяснить, поддерживает ли ваш компоновщик его и как он называется. На компоновщике Sun он называется -z allextract и -z defaultextract.

1 голос
/ 03 февраля 2010

Ваши файлы не извлекаются из файла .a, потому что ничто не ссылается на них. Почему вы делаете файл .a первым? Вам лучше создать файл .o, связав их с параметром -r.

...