Свяжите статические библиотеки с функциями, имеющими один и тот же прототип, но служащими разным целям

#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:

есть ли элегантное и простое решение для этого сценария?

Решения:

  1. Напишите 2 программы, работающие в архитектуре клиент-сервер. Запускаются два сервера, каждый из которых связан с разным типом статической библиотеки и прослушивает разные сокеты. Клиент выполняет работу , и когда он хочет выполнить работу над определенным типом bds , он вызывает один из серверов для выполнения работы.

Вы можете создать свой собственный протокол или изучить некоторые существующие RPC и использовать протобуфферы или что-то подобное.

  1. Скомпилируйте libbfd.a в общую библиотеку и используйте dlopen для отдельной ссылки на каждый тип общей библиотеки.
  2. Используйте 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 , как открыть общую библиотеку, даже с примером того, как вызвать функцию из общей библиотеки.