Что я должен сделать, если две библиотеки предоставляют функции то же имя, генерирующее конфликт?

Ну, как видите, никто не ответил! Я должен был создать новое приложение и начать работать снова! даже копирование кодов в новое приложение не сработало !!! одной из проблем была моя версия узла. Я упоминал об этом на тот случай, если у кого-то возникнет та же проблема, и он захочет ее решить.

85
задан Ciro Santilli 新疆改造中心法轮功六四事件 17 July 2015 в 06:54
поделиться

9 ответов

  • Если Вы управляете один или оба: отредактируйте, чтобы изменить имя и перекомпилировать Или эквивалентно видеть Ben и ответы unknown, которые будут работать без доступа к исходному коду.
  • Если Вы не управляете ни одним из них, можно обернуть одного из них. Это - компиляция другой (статически связанный!) библиотека, которая не делает ничего кроме реэкспорта все символы оригинала кроме нарушающего, который достигнут через обертку с альтернативным названием. Какая стычка.
  • Добавленный позже: Так как qeek говорит, что он говорит о динамических библиотеках, решения, предложенные Ferruccio и mouviciel, являются, вероятно, лучшими. (Я, кажется, живу в течение многих давно дней, когда статическая связь была значением по умолчанию. Это окрашивает мои взгляды.)

Кстати комментарии: "экспортом" я означаю делать видимым к модулям, связывающимся с библиотекой---эквивалентный extern ключевое слово в объеме файла. То, как этим управляют, является зависимым компоновщика и ОС. И это - что-то, что я всегда должен искать.

49
ответ дан Community 24 November 2019 в 08:19
поделиться

Возможно переименовать символы в использовании объектного файла objcopy --redefine-sym old=new file (см. человека objcopy).

Затем просто вызовите функции с помощью их новых имен и ссылки с новым объектным файлом.

49
ответ дан Machta 24 November 2019 в 08:19
поделиться

В соответствии с 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 поддерживают схожую функциональность, но я не могу думать об их именах.

14
ответ дан Ferruccio 24 November 2019 в 08:19
поделиться

Вот мысль. Откройте одну из незаконных библиотек в Hex-редакторе и измените все случаи незаконных строк к чему-то еще. Необходимо затем смочь использовать новые имена во всех будущих вызовах.

ОБНОВЛЕНИЕ: Я просто сделал это на этом конце, и это, кажется, работает. Конечно, я не протестировал это полностью - это может быть не больше, чем действительно хороший способ сдуть Ваш участок с hexedit ружьем.

8
ответ дан Sniggerfardimungus 24 November 2019 в 08:19
поделиться

Вы не должны использовать их вместе. Если я помню правильно, компоновщик выпускает ошибку в таком случае.

Я не попробовал, но решение может быть с dlopen(), dlsym() и dlclose() которые позволяют Вам программно обрабатывать динамические библиотеки. Если Вам не нужны две функции одновременно, Вы могли бы открыть первую библиотеку, использовать первую функцию и закрыть первую библиотеку перед использованием второй библиотеки/функции.

6
ответ дан mouviciel 24 November 2019 в 08:19
поделиться

Этой проблемой является причина, C++ имеет пространства имен. Нет действительно отличного решения в c для 2 третьих лиц, освобождает наличие того же имени.

Если это - динамический объект, Вы смогли явно загружать общие объекты (LoadLibrary/dlopen/etc) и называть его тем способом. Поочередно, если Вам не нужно, оба освобождают одновременно в том же коде, можно, возможно, сделать что-то со статическим подключением (если у Вас есть .lib/.a файлы).

Ни одно из этих решений не относится ко всем проектам, конечно.

4
ответ дан Brian Mitchell 24 November 2019 в 08:19
поделиться

Поклясться? Насколько я знаю, нет очень, можно сделать, если у Вас есть две библиотеки, которые выставляют точки ссылки с тем же именем, и необходимо связаться против обоих.

3
ответ дан Vatine 24 November 2019 в 08:19
поделиться

Необходимо записать библиотеку-оболочку вокруг одного из них. Ваша библиотека-оболочка должна выставить символы с уникальными именами и не выставить символы групповых имен.

Ваша другая опция состоит в том, чтобы переименовать имя функции в заголовочном файле и переименовать символ в архиве объекта библиотеки.

Так или иначе, для использования обоих это собирается быть заданием взлома.

2
ответ дан James Caccese 24 November 2019 в 08:19
поделиться

Я никогда не использовал dlsym, dlopen, dlerror, dlclose, dlvsym, и т.д., но я смотрю на страницу справочника, и это дает пример открытия libm.so и извлечения потому что функция. dlopen проходит процесс поиска коллизий? Если это не делает, OP мог бы просто загрузить обе библиотеки вручную и присвоить новые имена ко всем функциям, которые обеспечивают его библиотеки.

0
ответ дан Sniggerfardimungus 24 November 2019 в 08:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: