从非托管C++创建DLL

hjw*_*ide 5 c++ dll unmanaged cmake visual-studio-2010

我目前有一个用非托管C++编写的控制台应用程序,源代码由一个入口点main和一些其他函数组成.我需要从这段代码创建一个DLL,以便我可以从其他项目中使用它,特别是来自托管C++.(另一个问题:我是否必须为此目的编写一个包装类?)

据我所知,无论是托管/非托管C++还是创建DLL,我都遵循本教程并设法通过仅使用VS2010(无CMake)来启动并运行一个简单的Hello World DLL.

但是,我的这个项目有很多依赖项(例如Point Cloud Library),所以我通常使用CMake生成Visual Studio 2010解决方案,然后构建成可执行文件,如PCL教程中所述.如何使用CMake构建一个将构建到DLL中的VS2010项目?

总结一下我的问题:

  1. 我有一个需要很多依赖项的非托管C++代码项目.
  2. 我想从这段代码创建一个可以从托管C++调用的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
Run Code Online (Sandbox Code Playgroud)

MyCode.cpp:我没有对源文件进行任何更改,我应该做什么?

Joh*_* S. 5

不幸的是,我无法帮助您使用托管代码部分,但这是您在CMake中创建DLL的方式:

首先,而不是使用

`ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )` 
Run Code Online (Sandbox Code Playgroud)

在你的CMakeLists.txt,使用

`ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )`
Run Code Online (Sandbox Code Playgroud)

这将配置解决方案以创建DLL而不是可执行文件.

但是,为了能够将此DLL与项目一起使用,您需要导出要使用的符号.为此,您需要添加__declspec( dllexport )到类和/或函数声明中.然后构建库将产生两个文件,a.dll和a .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
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想能够使用C中的那些函数(以及能够使用C函数的语言),你应该用你的声明包装你的声明 extern "C" {

extern "C" {
    API_DECL void myFirstFunction();
    API_DECL void mySecondFunction();
}
Run Code Online (Sandbox Code Playgroud)