Как заставить символы из статической библиотеки быть включены в сборку общей библиотеки?
Я пытаюсь построить библиотеку общих объектов, которая будет открыта программой с использованием dlopen(). Эта библиотека будет использовать функциональные возможности, предоставляемые отдельной статической библиотекой.
Я включил соответствующий флаг в строку ссылки для добавления в статическую библиотеку при компоновке динамической библиотеки (например, у меня есть -lfoo для libfoo.a), и компоновщик не жалуется. Однако, когда основная программа вызывает dlopen () для динамической библиотеки, вызов завершается с сообщением "неопределенный символ", ссылающимся на символ из статической библиотеки.
Запуск nm указывает на то, что рассматриваемый символ не определен в динамической библиотеке, и основная программа не содержит его, так как я могу заставить компоновщик выдвинуть этот символ? Сам символ находится в разделе неинициализированных данных (тип символа "B" на выходе в нм).
3 ответа
--whole-archive
опция линкера должна сделать это. Вы бы использовали это как, например,
gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib
Что вы испытываете, так это то, что по умолчанию компоновщик будет искать символы в статическом архиве, который необходим для создаваемого вами двоичного файла, и, если он нужен, он будет включать весь.o, в котором находится символ. Если ваш общий ресурс Библиотека не нуждается ни в одном из символов, они не будут включены в вашу общую библиотеку.
Помните, что код, который становится общей библиотекой, должен быть скомпилирован со специальными параметрами, такими как -fpic
, поскольку вы включаете статическую библиотеку в свою общую библиотеку, статическая библиотека должна быть скомпилирована с теми же параметрами.
Недавно я искал решение для того же самого. Я нашел с помощью
--undefined=symbol
или же
-u symbol
решает проблему.
Другой способ - взять адрес функции где-нибудь во время инициализации библиотеки. Это позволит вам использовать символ.