5

我目前有一个用非托管 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 更改了您的线路,并且按预期工作。这是我添加到头文件中的内容,我在正确的轨道上吗?

我的代码.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:我没有对源文件进行任何更改,我应该做任何更改吗?

4

1 回答 1

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 )到您的类和/或函数声明中。然后构建库将产生两个文件,一个 . dll和一个.lib。后一个是你在其他项目中使用这个库时需要的所谓的导入库。将.dll在运行时需要。

但是:当你想使用你的库时,你需要使用__declspec( dllimport)(而不是dllexport)。为了避免使用两个头文件,通常的方法是使用预处理器。YourLibrary_EXPORTS defineCMake 实际上通过在您的库项目中提供一个来帮助您。

总结一下:

#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();
}
于 2013-01-22T15:46:10.620 回答