Visual Studio 2010 — создание DLL из неуправляемого переполнения стека

В настоящее время у меня есть консольное приложение, написанное на неуправляемом C ++, исходный код состоит из точки входа main и некоторые другие функции. Мне нужно создать DLL из этого кода, чтобы я мог использовать ее из других проектов, в частности из управляемого C ++. (Другой вопрос: должен ли я написать класс-оболочку для этой цели?)

Поскольку я почти ничего не знаю об управляемом / неуправляемом C ++ и создании DLL, я следовал этот урок и ему удалось установить и запустить простую DLL-библиотеку Hello World, используя только VS2010 (без CMake).

Тем не менее, этот мой проект имеет много зависимостей (например, Библиотека облаков точек), и поэтому я обычно использую CMake для генерации решения Visual Studio 2010, которое затем встраивается в исполняемый файл, как описано в Учебное пособие по PCL. Как я могу использовать CMake для создания проекта VS2010, который будет встроен в DLL?

Подводя итог моей проблемы:

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

Дополнительная информация:
Windows 7, Visual Studio 2010 Ultimate, CMake 2.8.10.2

РЕДАКТИРОВАТЬ:
Я использовал CMake с вашей измененной строкой, и она работала, как и ожидалось. Это то, что я с тех пор добавил в свой заголовочный файл, я на правильном пути?

MyCode.h

#ifdef MyLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else
#define API_DECL __declspec( dllimport )

#include <iostream>
#include <pcl/...>
etc...

API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
#endif

MyCode.cpp: я не вносил никаких изменений в исходный файл.

5

Решение

К сожалению, я не могу помочь вам с частью управляемого кода, но вот как вы создаете DLL в CMake:

Прежде всего, вместо использования

`ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )`

в вашем CMakeLists.txtиспользовать

`ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )`

Это позволит настроить решение для создания DLL, а не исполняемого файла.

Однако, чтобы иметь возможность использовать эту DLL с вашими проектами, вам нужно экспортировать символы, которые вы хотите использовать. Для этого нужно добавить __declspec( dllexport ) к вашему классу и / или объявлениям функций. Сборка библиотеки даст два файла, а.dll и .lib, Последняя — это так называемая библиотека импорта, которая нужна вам, когда вы хотите использовать эту библиотеку в других ваших проектах. .dll потребуется во время выполнения.

тем не мение: Если вы хотите использовать свою библиотеку, вы должны использовать __declspec( dllimport) (скорее, чем dllexport). Чтобы избежать использования двух заголовочных файлов, обычный способ сделать это — использовать препроцессор. CMake на самом деле помогает вам, предоставляя YourLibrary_EXPORTS define в вашем проекте библиотеки.

Подвести итоги:

#ifndef YOUR_CLASS_H
#define YOUR_CLASS_H

#ifdef YourLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else
#define API_DECL __declspec( dllimport )
#endif

class APIDECL YourClass  {
void foo();
void bar();
};

#endif // YOUR_CLASS_H

РЕДАКТИРОВАТЬ:
Если вы хотите иметь возможность использовать эти функции из C (и языки, которые могут использовать функции C), вы должны обернуть свои объявления с extern "C" {

extern "C" {
API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]