我目前有一个用非托管C ++编写的控制台应用程序,源代码由一个入口点main
和一些其他函数组成。我需要从这段代码创建一个DLL,以便我可以从其他项目中使用它,特别是来自托管C ++。 (另一个问题:我是否必须为此目的编写一个包装类?)
据我所知,托管/非托管C ++和创建DLL几乎没有,我跟着this tutorial设法通过仅使用VS2010(没有CMake)来启动并运行一个简单的Hello World DLL。
但是,我的这个项目有很多依赖项(例如Point Cloud Library),因此我通常使用CMake生成Visual Studio 2010解决方案,然后构建成可执行文件,如{{3 }}。我如何使用CMake构建一个将构建为DLL的VS2010项目?
总结我的问题:
额外信息: 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:我没有对源文件进行任何更改,我应该做什么?
答案 0 :(得分:5)
不幸的是,我无法帮助您使用托管代码部分,但这是您在CMake中创建DLL的方式:
首先,而不是使用
`ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )`
在CMakeLists.txt
中,使用
`ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )`
这将配置解决方案以创建DLL而不是可执行文件。
但是,为了能够将此DLL与项目一起使用,您需要导出要使用的符号。为此,您需要将__declspec( dllexport )
添加到类和/或函数声明中。然后构建库将生成两个文件,a。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();
}