Nano Hash - криптовалюты, майнинг, программирование

C++ Использование оберток в одной программе

У меня есть программа C++ A, в которой я использую две библиотеки B и C, которые в основном являются обертками больших библиотек, Y и Z (входит в состав "extern" C). Я хотел бы иметь возможность запускать обе в одной программе.

  • Это проект cmake.

  • У меня есть обе оболочки B и C в разных подкаталогах моего проекта, а библиотеки Y и Z, которые они «оборачивают», находятся в подкаталогах внутри каждого соответствующего подкаталога.

  • Заголовок не включен, кроме заголовков моих оберток.

  • Функции из B и C имеют разные имена и пространства имен, а также разные функции, используемые из Y и Z. Но, к сожалению, эти функции вызывают другие функции, определенные в Y и Z, которые имеют такое же имя и аргументы, и это приводит к ошибке времени выполнения (функция из Y вызывает функцию из Z вместо своей собственной).

Я хотел бы решить эту проблему без необходимости писать две разные программы, которые взаимодействуют друг с другом. Я уже пытался сделать B, C, Y и Z статическими библиотеками.

  • Пробовал вариант переименования в связанном вопросе «Конфликт функций C». Это навлекло на меня действительно большие неприятности. Возможно, есть что-то еще, что нужно исправить в том, как создаются CMakefiles.
  • #P7# <блочная цитата>
     add_library(foo STATIC foo1.c)
     install(TARGETS foo DESTINATION lib EXPORT myproj-targets)
     install(EXPORT myproj-targets DESTINATION lib/myproj)
    

И за их включение:

 include(${PREFIX}/lib/myproj/myproj-targets.cmake)  add_executable(myexe src1.c)  target_link_libraries(myexe foo)

Ответы:


1

Я бы подошел к этому, поместив B и C в DLL, каждая DLL связывает только зависимую библиотеку: ссылки B.DLL из Y.lib, ссылки C.DLL из Z.lib. Это разделяет ваши конфликтующие API-интерфейсы C на отдельные двоичные файлы, но сохраняет их в одной программе.

См. конфликт функций C.

23.10.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..