Экспортировать неуправляемые классы из библиотеки DLL Visual C ++?

StackOverflow https://stackoverflow.com/questions/1208271

Вопрос

При создании библиотеки DLL с Visual C ++ 2008 у меня есть пара вариантов.Я могу создать "Библиотека классов", который, как я понимаю, на самом деле даст мне библиотеку .Net, которая использует CLI (управляемое) расширение C ++.

Поскольку я этого не хочу, и я предположил, что мне нужна статика.Файл LIB для ссылки на другой исполняемый проект Visual C ++ для Windows, я выбираю вместо этого "Проект Win32" и на панели настроек приложения указываю библиотеку DLL C ++ (без MFC).

Это создаст проект с файлом .cpp, который должен быть там, где я определяю "экспортированные функции для приложения DLL".

Похоже, это тоже не то, чего я хочу.По сути, то, что я ищу, - это собственный эквивалент C ++ того, что в C # .NET было бы сборкой библиотеки классов.Я хочу упаковать некоторые классы в библиотеку DLL, а затем создать проект .EXE используйте классы библиотеки DLL включив заголовочные файлы проекта DLL и связавшись с .БИБЛИОТЕКА для разрешения ссылок.

Каков обычный способ сделать это?

Это было полезно?

Решение

Вы делаете это правильно. Вам нужно пометить свои классы с помощью __declspec (dllexport) сделать их доступными извне проекта. Когда вы создаете проект, вы генерируете .DLL и .LIB.

Другие советы

  • Создайте новый проект
  • Visual C++ :Win32 :Проект Win32
  • В настройках приложения выберите DLL и установите флажок "Экспортировать символы".

Когда вы создадите проект, он удалит для вас экспортированный класс, обычно с именем C{MyLib}.

Вы правы сделать C ++ (без MFC) DLL. Вы можете создать свои классы и те точки входа, которые вы определили, будут экспортированы из этой DLL для использования другим кодом C ++ (например, приложением Win32, написанным на C ++).

Так как имена C ++ автоматически искажаются компилятором в странные и замечательные значения, экспортировать их нецелесообразно, как если бы клиенты DLL, например, были C-программами. Но если все в C ++, вы должны быть в порядке.

Если вы создаете некоторые классы, вы можете выбрать их динамическое связывание (в виде DLL), но вам потребуется библиотека импорта (созданная для вас автоматически), которая содержит определения символов DLL. Вы также можете выбрать статическую ссылку на свой код из приложения - в этом случае вы получите статическую библиотеку (также .LIB), которая содержит фактический объектный код в ваших классах, а не символы в DLL.

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

Я думаю, что эта статья описывает, что вы пытаетесь сделать: http://www.codeproject.com/KB/mcpp/usingcppdll.aspx

Лично я предпочитаю экспортировать функции C (в отличие от C ++), где я делаю указатель this явным, чтобы избежать необходимости заботиться об украшении имени метода, специфичного для компилятора, и выставлять функции, сгенерированные компилятором.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top