#c
Вопрос:
Я нахожусь в странной ситуации, когда мне нужны две функции с одинаковыми прототипами, служащие разным целям в моей программе.
Моя программа ссылается на функции в пакете двоичных файловых дескрипторов GNU libbfd.a
, который сгенерирован из binutils
. Мне нужны два libbfd.a
» s для двух целей (например, ARM и RISC-V). По-видимому, в этих двух копиях libbfd.a
будет много функций, имеющих один и тот же прототип (потому что они созданы из одного и того же binutils
), но служащих разным целям (потому что их цели различны).
Я не могу просто связать свою программу с этими двумя libbfd.a
. Только одна копия функций будет включена в мою окончательную программу, потому что …
Основная особенность статических библиотек заключается в том, что индекс символов позволяет связывать только те
libbfd.a
элементы, в которых отсутствуют символы.
Я не могу разбить статические библиотеки на объектные файлы. multiple definitions of ...
При соединении возникнет ошибка.
В любом случае, две копии функций просто не могут существовать в моей программе одновременно.
В конечном счете, существует ли элегантное и простое решение для этого сценария?
Комментарии:
1. Помимо ссылки, как ваш код вызывает эти функции? Я имею в виду, ты же должен знать, кому позвонить, верно?
2. Создайте два отдельных двоичных файла, каждый из которых связан с соответствующей целью.
3. Нет, в C у вас не может быть двух функций с одинаковым именем и внешней связью. Если одна из функций используется только в одном блоке компиляции, вы можете сделать это
static
4. Вместо этого вам следует сделать это с помощью динамических библиотек. Почему вы не можете использовать
dlopen
dl
библиотеку во время выполнения ?5. @L. Z. Какие исследования вы провели? Что вы пробовали?
Ответ №1:
есть ли элегантное и простое решение для этого сценария?
Решения:
- Напишите 2 программы, работающие в архитектуре клиент-сервер. Запускаются два сервера, каждый из которых связан с разным типом статической библиотеки и прослушивает разные сокеты. Клиент выполняет работу , и когда он хочет выполнить работу над определенным типом
bds
, он вызывает один из серверов для выполнения работы.
Вы можете создать свой собственный протокол или изучить некоторые существующие RPC и использовать протобуфферы или что-то подобное.
- Скомпилируйте
libbfd.a
в общую библиотеку и используйтеdlopen
для отдельной ссылки на каждый тип общей библиотеки. - Используйте
objcopy
для переименования всех символов в одной статической библиотеке и предоставьте свои собственные заголовки с переименованными символами и обычно связывайтесь с ними.
Я не могу разбить статические библиотеки на объектные файлы.
Статическая библиотека — это архив объектных файлов. Вы всегда можете распаковать его в объектные файлы.
Комментарии:
1. Не могли бы вы подробнее остановиться на
2
этом ? Zilog80 также упомянул об этом в комментариях. Мое понимание различий между статическими и динамическими библиотеками примитивно.2. Что тут уточнять? Я думаю, что точка
2
достаточно длинная, чтобы дать вам достаточно информации, чтобы знать, что искать в Google.My understanding about the differences between static and dynamic libraries is primitive.
А потом исследовать их?3. Исследуйте, что такое статическая библиотека и общая библиотека , смотрите
man ld
иman ld.so
иman ar
, исследуйте Интернет о том , как создать общую библиотеку, но, честноbinutils
говоря, она уже должна быть созданаlibbfd.so
, по крайней мере, в моей системе она уже установлена. Затем исследуйтеdlopen
, посмотритеman dlopen
, как открыть общую библиотеку, даже с примером того, как вызвать функцию из общей библиотеки.