Ну, как видите, никто не ответил! Я должен был создать новое приложение и начать работать снова! даже копирование кодов в новое приложение не сработало !!! одной из проблем была моя версия узла. Я упоминал об этом на тот случай, если у кого-то возникнет та же проблема, и он захочет ее решить.
Кстати комментарии: "экспортом" я означаю делать видимым к модулям, связывающимся с библиотекой---эквивалентный extern
ключевое слово в объеме файла. То, как этим управляют, является зависимым компоновщика и ОС. И это - что-то, что я всегда должен искать.
Возможно переименовать символы в использовании объектного файла objcopy --redefine-sym old=new file
(см. человека objcopy).
Затем просто вызовите функции с помощью их новых имен и ссылки с новым объектным файлом.
В соответствии с Windows, Вы могли использовать LoadLibrary (), чтобы загрузить одну из тех библиотек в память и затем использовать GetProcAddress () для получения адреса каждой функции, которую необходимо вызвать и вызвать функции через указатель функции.
например.
HMODULE lib = LoadLibrary("foo.dll");
void *p = GetProcAddress(lib, "bar");
// cast p to the approriate function pointer type (fp) and call it
(*fp)(arg1, arg2...);
FreeLibrary(lib);
получил бы адрес функции, названной панелью в foo.dll, и назвал бы его.
Я знаю, что системы Unix поддерживают схожую функциональность, но я не могу думать об их именах.
Вот мысль. Откройте одну из незаконных библиотек в Hex-редакторе и измените все случаи незаконных строк к чему-то еще. Необходимо затем смочь использовать новые имена во всех будущих вызовах.
ОБНОВЛЕНИЕ: Я просто сделал это на этом конце, и это, кажется, работает. Конечно, я не протестировал это полностью - это может быть не больше, чем действительно хороший способ сдуть Ваш участок с hexedit ружьем.
Вы не должны использовать их вместе. Если я помню правильно, компоновщик выпускает ошибку в таком случае.
Я не попробовал, но решение может быть с dlopen()
, dlsym()
и dlclose()
которые позволяют Вам программно обрабатывать динамические библиотеки. Если Вам не нужны две функции одновременно, Вы могли бы открыть первую библиотеку, использовать первую функцию и закрыть первую библиотеку перед использованием второй библиотеки/функции.
Этой проблемой является причина, C++ имеет пространства имен. Нет действительно отличного решения в c для 2 третьих лиц, освобождает наличие того же имени.
Если это - динамический объект, Вы смогли явно загружать общие объекты (LoadLibrary/dlopen/etc) и называть его тем способом. Поочередно, если Вам не нужно, оба освобождают одновременно в том же коде, можно, возможно, сделать что-то со статическим подключением (если у Вас есть .lib/.a файлы).
Ни одно из этих решений не относится ко всем проектам, конечно.
Поклясться? Насколько я знаю, нет очень, можно сделать, если у Вас есть две библиотеки, которые выставляют точки ссылки с тем же именем, и необходимо связаться против обоих.
Необходимо записать библиотеку-оболочку вокруг одного из них. Ваша библиотека-оболочка должна выставить символы с уникальными именами и не выставить символы групповых имен.
Ваша другая опция состоит в том, чтобы переименовать имя функции в заголовочном файле и переименовать символ в архиве объекта библиотеки.
Так или иначе, для использования обоих это собирается быть заданием взлома.
Я никогда не использовал dlsym, dlopen, dlerror, dlclose, dlvsym, и т.д., но я смотрю на страницу справочника, и это дает пример открытия libm.so и извлечения потому что функция. dlopen проходит процесс поиска коллизий? Если это не делает, OP мог бы просто загрузить обе библиотеки вручную и присвоить новые имена ко всем функциям, которые обеспечивают его библиотеки.