Как заставить символы из статической библиотеки быть включены в сборку общей библиотеки? - PullRequest
17 голосов
/ 31 августа 2011

Я пытаюсь создать библиотеку общих объектов, которая будет открыта программой с использованием dlopen (). Эта библиотека будет использовать функциональные возможности, предоставляемые отдельной статической библиотекой.

Я включил соответствующий флаг в строку ссылки, чтобы включить статическую библиотеку при компоновке динамической библиотеки (например, у меня -lfoo для libfoo.a), и компоновщик не жалуется. Однако, когда основная программа вызывает dlopen () для динамической библиотеки, вызов завершается с сообщением «неопределенный символ» со ссылкой на символ из статической библиотеки.

Запуск nm означает, что рассматриваемый символ не определен в динамической библиотеке, и основная программа не содержит его, так как я могу заставить компоновщик выдвинуть этот символ? Сам символ находится в разделе неинициализированных данных (тип символа "B" на выходе в нм).

Ответы [ 3 ]

18 голосов
/ 01 сентября 2011

Параметр компоновщика --whole-archive должен сделать это. Вы бы использовали его, например,

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib

Что вы испытываете, так это то, что по умолчанию компоновщик будет искать символы в статическом архиве, который необходим для создаваемого вами двоичного файла, и, если он нужен, он будет включать в себя весь .o, в котором находится символ. Если вашей общей библиотеке не нужны никакие символы, они не будут включены в вашу общую библиотеку.

Помните, что код, который становится общей библиотекой, должен быть скомпилирован со специальными параметрами, такими как -fpic, так как вы включаете статическую библиотеку в свою общую библиотеку, статическая библиотека должна быть скомпилирована с теми же параметрами.

12 голосов
/ 18 января 2012

Недавно я искал решение для того же. Я нашел с помощью

--undefined=symbol

или

-u symbol

решает проблему.

5 голосов
/ 08 октября 2016

Еще один хак - это взять адрес функции где-нибудь во время инициализации библиотеки. Это позволит вам использовать символ.

...