Си. Как подключить и использовать две библиотеки с одинаковым интерфейсом?
Есть две библиотеки с практически одинаковыми *.h файлами.
Необходимо во время выполнения программы, в зависимости от параметров обращаться к одной из них.
Каким образом это делается в Си?
Можно-ли как-то переименовать эти функции?
> Можно-ли как-то переименовать эти функции?
Я конечно в С++ бум бум. Но разве так нельзя?
namespace Foo1 {
#include "../lib1/iostream.h"
}
namespace Foo2 {
#include "../lib2/iostream.h"
}
Виталий Филинков: А я про что сказал? Обёртка не спасёт в этом случае. Совпали имена, линкер либо сругнётся, либо просто в обоих случаях будет дёргать одну и ту же функцию (что наиболее вероятно).
Виталий Филинков: Советую вам познакомится, как работает неявная линковка. Исходные библиотеки попадут в одно адресное пространство в любом случае и при этом RTTI информация будет объединена, ядро (по сути выполнит линковку) подсунет адрес на одно и то же имя функции первое что попадётся в таблице символов. В итоге по отдельности работать будет всё правильно, а при загрузке уже 2х библиотек с одинаковыми именами будет вызываться только одна из них. И обёртки тут не помогут, хоть тысячу их сделать, таблица имён одна на весь процесс и все подключенные библиотеки.
Виталий Филинков: А т.к. адреса при загрузке будут меняется, то ядро это вынуждено сделать и всё сломать в итоге. Аналогичная беда если собрать библиотеки с ключами для сведения RTTI в одно пространство и подключать их явно методом dlopen.
AxisPod: почему не получится? Просто придется для каждой собрать отдельную обертку в качестве уже готовой библиотеки. Да и в задаче не говорится, что библиотеки уже собраны. Я не говорю, что предложенный мною путь оптимален. Но он возможен. Было как-то дело - были две либы разных версий. Требовалась половина функционала из старой версии, а половина - из новой. Именно так и поступили: для каждой либы обертку с переименованием функций и получением двух новых либ, а потом обертка над этими двумя обертками с получением итоговой либы. И вот ее уже использовали в проекте.