В C / C ++, как связать динамически подключаемую библиотеку, скомпилированную в GCC / G ++ в MS VStudio? - PullRequest
0 голосов
/ 07 июня 2010

В настоящее время я использую Flex & Bison, сгенерировавший несколько кодов для разработки инструментов, похожих на SQL-парсер, этот код не может быть скомпилирован без вывода сообщений (может быть, это другая тема) в VS2005, но GCC / G ++ работает хорошо, затем я скомпилировал они кодируют с помощью mingw в dll (в windows xp), а затем связывают эти фасады функций в VS2005, но, похоже, не могут связать dll во время связывания.

MS VS2005 распознает dll, скомпилированную с помощью mingw на windows? Есть ли что-то, что мне нужно сделать дополнительно? Например, добавить что-то во включаемый файл, который объявляет экспортируемые API?

Кто-нибудь может дать несколько советов?

Условие, как и в VS2005, если вы хотите экспортировать некоторые API, вы можете показать файл * .def, чтобы сообщить nmake, какой API вы хотите экспортировать, а затем вы можете создать (или некоторые) * .h файл для объявления чего-либо об этих API (добавление некоторого префикса stdcall в качестве протокола вызова) и некоторое определение типа данных. Но с GCC / G ++ вам не нужно делать такие скучные вещи, просто используйте [ar], вы можете получить эти API, так что мой файл * .h не добавляет протокол вызова и не * .def, как объявление общей функции , После создания * .dll добавьте файл * .h и [mv] сгенерированные * .dll в каталог проекта VS2005, а затем установите связь * .dll в настройках проекта. Эти шаги породили мой вопрос?

Кстати, я обнаружил и протестировал dll, скомпилированную в VC6, может быть связано с mingw в Windows XP, но обратное не может работать.

В любом случае, простите мой плохой английский, и спасибо за вашу заботу.

1 Ответ

1 голос
/ 07 июня 2010

VS2005 не распознает DLL для компиляции чего-либо, и я сомневаюсь, что mingw делает.

Когда ваше приложение должно использовать DLL, вам нужно сообщить VS2005, какие функции предоставляет DLL.

привязка времени загрузки

Точки входа определены в каталоге EXPORT библиотеки DLL. Содержимое каталога EXPORT может быть определено с помощью файла DEF при компиляции DLL. Экспорт данных также может быть определен с использованием директивы #pragma __declspec(dllexport). Когда вы компилируете DLL, компоновщик также сгенерирует файл * .LIB для приложения-потребителя. Эта библиотека называется библиотекой импорта.

Подписи экспортируемых функций должны предоставляться прототипами функций, обычно в файле * .h.

Когда вы компилируете свое приложение с привязкой по времени загрузки, вы включаете файл * .h в свой исходный код и добавляете библиотеку импорта в настройки проекта. (не * .DLL) Когда O / S загружает ваше приложение, статический код в библиотеке импорта загрузит DLL, прочитает каталог EXPORT и исправит все заглушки для доступа к экспортированным функциям (и другим символам).

Динамическое связывание

Вы можете опустить библиотеку импорта и загрузить DLL с вашим кодом, используя LoadLibrayy в соответствующее время. Вам нужно определить указатели на точки входа DLL самостоятельно и инициализировать эти указатели перед вызовом GetProcAddress реальных функций.

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