Преобразование проекта C ++, разработанного до сих пор как автономный исполняемый файл, в DLL - PullRequest
5 голосов
/ 10 мая 2011

(я использую Microsoft Visual Studio 2010 на 64-битной машине с Windows 7)

Я разработал программу на C ++, которая представляет собой скорее библиотеку, которая со временем стала довольно сложной.,Сейчас он работает как простой исполняемый файл, но я хотел бы преобразовать его в DLL, чтобы другие функции могли легко получить доступ к этой функции.

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

Я знаю, что могу выбрать цель компиляции для «DLL», но у меня есть ощущение, что одна не справится с работой.

  • Если я успешно скомпилировал свой проект в файл DLL, как мне использовать в нем функции из исполняемого проекта?

  • Можно ли избежатьиспользуя _dllexport и импортируя каждую функцию по имени?

  • Как статически связать DLL и каковы (не) преимущества этого?

Ответы [ 4 ]

3 голосов
/ 10 мая 2011

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

Когда вы создаете проект как DLL, IDE сгенерирует

  1. DLL-файл для среды выполнения и
  2. LIB-файл, содержащий экспортированную информацию о разрешении функций - это та, с которой вы ссылаетесь.

По определению вы не можете статически связать DLL (это DYNAMIC библиотека ссылок) - вместо этого вы ссылаетесь на библиотеку, которая экспортирует функции из DLL, а затем DLL загружается во время выполнения, либо автоматически при запуске процесса, либо по требованию.Также возможно загрузить DLL полностью по требованию без каких-либо статических связей (см. LoadLibraryEx и т. Д.).

2 голосов
/ 10 мая 2011

Поскольку вы используете C ++, я предполагаю, что вы экспортируете классы (?). действительно хороший пример над CodeProject, который проведет вас через несколько вариантов. Самым чистым из которых является использование абстрактного интерфейса:

Абстрактный интерфейс C ++ (т. Е. Класс C ++, который содержит только чистые виртуальные методы и не содержит элементов данных) пытается получить лучшее из обоих миров: независимый от компилятора чистый интерфейс к объекту и удобный объектно-ориентированный метод звонки. Все, что требуется сделать, это предоставить заголовочный файл с объявлением интерфейса и реализовать фабричную функцию, которая будет возвращать вновь созданные экземпляры объекта. Только фабричная функция должна быть объявлена ​​с помощью спецификатора __declspec (dllexport / dllimport). Интерфейс не требует никаких дополнительных спецификаторов.

Example of how the abstract interface example works

Вы не можете статически связываться с Dynamic Link Library . Если вы хотите связать статически, вместо этого создайте .lib.

1 голос
/ 25 мая 2011
  • Чтобы использовать вашу DLL, вы должны #include заголовочные файлы, связанные с вашим dll / lib, и ссылку на файл .lib, связанный с вашим .dll

  • Вам потребуется _ declspec (dllexport) / _declspec (dllimport), чтобы указать, что вы хотите экспортировать / импортировать содержимое библиотеки DLL.Это можно легко сделать следующим образом:

 #ifdef FOO_EXPORTS
      #define EXPORT_ME __declspec(dllexport)
 #else
      #define IMPORT_ME __declspec(dllimport)
 #endif

в заголовках для вашей dll, вам просто нужно #define FOO_EXPORTS и поместить EXPORT

foo.hpp

class EXPORT_ME foo2();

void EXPORT_ME foo_funct(foo2 *foo_ptr);

и любой файл, который должен использовать экспортируемые элементы, просто должен вызывать методы, определенные в заголовке foo.hpp (поведение по умолчанию - импорт)

use_foo.cpp

main()
{
      #include "foo.cpp";
foo2 myfoo;
foo_funct(&my_foo);
}
  • Как уже говорили другие, библиотека статически связана, а библиотека динамически связана.Любые ссылочные элементы при статическом связывании помещаются в строку во время компиляции в исходный код и обычно создают большую программу (по размеру файла), тогда как динамически связанные элементы связываются во время выполнения, поэтому размер файла обычно меньше.Есть много других плюсов / минусов в статических и динамических - я рекомендую вам перейти по ссылке Doc Browns для получения дополнительной информации
0 голосов
/ 10 мая 2011

Переключиться на gcc под MinGW.Построить и связать с DLL так же просто, как построить и связать со статической библиотекой.Он даже прозрачно обрабатывает искажение имен в C ++ (но тогда вызывающая программа также должна быть скомпилирована с помощью gcc).

...