В настоящее время у меня есть консольное приложение, написанное на неуправляемом C ++, исходный код состоит из точки входа main
и некоторые другие функции. Мне нужно создать DLL из этого кода, чтобы я мог использовать ее из других проектов, в частности из управляемого C ++. (Другой вопрос: должен ли я написать класс-оболочку для этой цели?)
Поскольку я почти ничего не знаю об управляемом / неуправляемом C ++ и создании DLL, я следовал этот урок и ему удалось установить и запустить простую DLL-библиотеку Hello World, используя только VS2010 (без CMake).
Тем не менее, этот мой проект имеет много зависимостей (например, Библиотека облаков точек), и поэтому я обычно использую CMake для генерации решения Visual Studio 2010, которое затем встраивается в исполняемый файл, как описано в Учебное пособие по PCL. Как я могу использовать CMake для создания проекта VS2010, который будет встроен в DLL?
Подводя итог моей проблемы:
Дополнительная информация:
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: я не вносил никаких изменений в исходный файл.
К сожалению, я не могу помочь вам с частью управляемого кода, но вот как вы создаете 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();
}
Других решений пока нет …