Visual C ++ - Связать плагин DLL с EXE? - PullRequest
9 голосов
/ 21 апреля 2009

Я в процессе переноса большого приложения C ++ из Linux (gcc) в Windows (Visual C ++ 2008) и у меня проблемы с компоновщиками с плагинами. В Linux это не было проблемой, так как .so поддерживает поиск символов времени выполнения, но, похоже, dll этого не поддерживает.

Некоторая справочная информация: Приложение (хост), в котором размещается среда сценариев, предоставляет интерфейсы для плагинов (разделяемых библиотек, которые загружаются во время выполнения посредством вызовов API сценариев), что позволяет расширять узел и API сценариев без перекомпиляции приложения узла. В Linux это просто вопрос включения заголовков хост-приложения в исходный код плагина, но в Windows я получаю ошибки компоновщика. Я не совсем уверен, с чем мне нужно связать Visual C ++ для разрешения этих символов.

Одна из наших зависимостей (с открытым исходным кодом, LGPL) имеет объявления препроцессора, которые она использует для вставки __declspec (dllexport) и __declspec (dllimport) в свои заголовки. Некоторые предварительные исследования показывают, что мне, возможно, придется сделать это также, но я хотел бы быть уверен, прежде чем я начну модифицировать целую кучу заголовков ядра. (Ранее я мог заставить это работать на MinGW, но мы решили, что поддержка Visual Studio является обязательным требованием для такого рода коммерческих проектов.)

Мой вопрос в двух словах: Как связать загруженные во время выполнения dll с exe-хостом в Visual C ++?

Редактировать: Чтобы прояснить проблему с примером, в моем хост-приложении есть класс Object , который представляет базовый тип объекта, к которому может обращаться скрипт. В моих плагинах у меня есть ряд классов, которые расширяют Object для выполнения других функций, таких как интеграция поддержки сети или новых визуальных элементов. Это означает, что моя dll должна связываться с символами в exe хоста, и я не уверен, как это сделать.

Ответы [ 4 ]

5 голосов
/ 21 апреля 2009

Что вы подразумеваете под "поиском символа времени выполнения"? Вы имеете в виду динамическую загрузку библиотек с использованием dlopen и dlsym и и так далее ? эквиваленты в Windows называются LoadLibrary и GetProcAddress.

В Windows вы не экспортируете символы из исполняемого файла. Вы должны только экспортировать их из DLL. Правильный способ решить вашу проблему - перестроить архитектуру так, чтобы экспортированные символы находились в dll, с которым могут связываться исполняемый файл и другие dll плагина.

1 голос
/ 06 июля 2012

Я реализовывал то же самое, создавая библиотеку плагинов для сборки под Linux и Windows.

Решением для Linux является использование опции -rdynamic в командной строке gcc. Это экспортирует все символы в основной исполняемый файл, чтобы плагин мог найти их при загрузке.

В Windows решение состоит в том, чтобы добавить __declspec (dllexport) перед определением тех функций в исполняемом файле, которые вы хотите использовать в dll. Компиляция создаст .lib-файл для DLL-библиотек для ссылки. Конечно работает под Visual studio 2008. Похожие посты: https://stackoverflow.com/a/3756083/1486836

1 голос
/ 21 апреля 2009

Как гласит 1800 ИНФОРМАЦИЯ, не делай так. Переместите Object из исполняемого файла в «третью» DLL. Связать плагины и исполняемый файл с этим.

1 голос
/ 21 апреля 2009

Вы не можете, легко. Загрузчик Windows не предназначен для экспорта символов из EXE и их привязки к символам в DLL.

Один шаблон, который я видел, это экспорт DLL определенной функции, которую вызывает EXE. Он принимает в качестве параметра структуру, которая содержит адреса функций в EXE для вызова DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...