从非托管 C++ 创建 DLL

2024-03-30

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

由于我对托管/非托管 C++ 和创建 DLL 几乎一无所知,所以我遵循本教程 http://msdn.microsoft.com/en-us/library/ms235636(v=vs.80).aspx并设法仅使用 VS2010(无 CMake)启动并运行一个简单的 Hello World DLL。

然而,我的这个项目有很多依赖项(例如点云库 http://pointclouds.org/),因此我通常使用 CMake 生成 Visual Studio 2010 解决方案,然后将其构建为可执行文件,如PCL教程 http://pointclouds.org/documentation/tutorials/using_pcl_pcl_config.php#using-pcl-pcl-config。如何使用 CMake 构建将构建为 DLL 的 VS2010 项目?

总结一下我的问题:

  1. 我有一个非托管 C++ 代码项目,需要大量依赖项。
  2. 我想从此代码创建一个可以从托管 C++ 调用的 DLL。

额外的信息: Windows 7、Visual Studio 2010 旗舰版、CMake 2.8.10.2

EDIT:我使用了 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:我没有对源文件进行任何更改,我应该进行任何更改吗?


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

首先,不要使用

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

in your CMakeLists.txt, use

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

这会将解决方案配置为创建 DLL 而不是可执行文件。

但是,为了能够在您的项目中使用此 DLL,您需要导出要使用的符号。为此,您需要添加__declspec( dllexport )您的类和/或函数声明。构建库将生成两个文件,一个 .dll and a .lib。后一个就是所谓的导入库,当你想在其他项目中使用这个库时,你需要使用它。这.dll将在运行时需要。

However:当你想使用你的库时,你需要使用__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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从非托管 C++ 创建 DLL 的相关文章

随机推荐

  • Handlebarsjs 检查字符串是否等于值

    Handlebars 是否可以在不注册助手的情况下检查字符串是否等于另一个值 我似乎无法在车把参考中找到与此相关的任何内容 例如 if sampleString This is a string do something if 看来你不能
  • 设置跨度元素的百分比宽度

    一个简单的问题 是否可以在CSS中设置span标签的百分比宽度 例如 span style width 50 span etc 在我的项目中 我目前正在使用 div 但当然在每个 div 标签之后都会插入换行符 我不想要 因此 最明显的解决
  • Dojo MVC 的布局实现

    我从头开始了一个道场项目 从一开始就尝试使用良好的实践 我对 dojo 工具包非常陌生 所以我正在浏览大量文档和示例 这些文档和示例给我留下了很多很酷的东西 但无法了解如何为未来的开发 或附加组件 实现架构 我在网上搜索并找到了这个dojo
  • 数据集和渲染器不应为空,并且在 AChartEngine 中应具有相同数量的系列

    我使用多 Y 轴图来绘制点 我有 1 X 轴 2 Y1 轴 3 Y2 轴 a 最初我用来在Y1轴 高度 上绘制5系列线 在Y2轴上绘制相同的5系列线 重量 两者都相对于x轴 这里不存在问题 这些系列线是标准线 用于每次计算 b 现在 如果用
  • 从打字稿接口生成 swagger 文档

    我在用着swager jsdoc https github com Surnet swagger jsdoc记录应用程序的所有 DTO 我想知道是否有任何方法可以从打字稿接口自动生成 swagger 文档 我的项目中有很多这样的东西 还有很
  • C# 锁定 SQL Server 表的方法

    我有一个 C 程序 需要对 SQL Server 表执行一组批量更新 20k 由于其他用户可以通过内联网网站一次更新一条记录 因此我们需要构建具有锁定表功能的C 程序 一旦表被锁定以防止其他用户进行任何更改 搜索 我们将需要执行请求的更新
  • 除了早期的 .NET 框架版本之外,Visual Studio 还可以定位早期的 C# 语法吗?

    简单的部分 使用下拉列表将 Visual Studio 2010 项目中的 NET 2 0 框架作为目标 困难的部分 是否可以针对特定的语法版本 例如var s hello world 在 VS2008 及以上版本中是有效的语法糖 但在 V
  • HTTP 请求从 Web 服务器分派到 CGI/FastCGI 进程

    为了更好地了解 Web 应用程序中 HTTP 请求的处理方式 Apache 等 Web 服务器如何将请求分派到其虚拟主机之一 无论框架 Rails PHP Java 如何 最初执行的程序是什么 如果有人能列出以 Rails 为例的步骤 据我
  • Android 和 SQLite:何时使用分号结束语句?

    如果您正在使用rawQuery or execSQL Android 上的 SQLite 方法 什么时候应该使用分号来结束语句 On 本教程 http www vogella com articles AndroidSQLite artic
  • 您可以从多个线程访问单个 std::unique_lock 吗?

    我在概念化如何unique lock应该是跨线程操作 我尝试制作一个快速示例来重新创建我通常会使用的东西condition variable for include
  • 使用 ng-repeat 时默认选中单选按钮

    我一直想使用 ng repeat 从屏幕上显示的单选按钮列表中签出一个单选按钮 但我的代码不起作用 这就是我正在做的 div class clubRole div div div
  • CI for Qt 应用程序:使用不同的 Qt 版本进行构建

    我使用 Travis CI 为我的简单 Qt 应用程序进行持续集成 我的 travis yml 文件看起来像这样 基于这个要点 https gist github com jreese 6207161 language cpp before
  • 如何在 C# 中获取应用程序设置的名称?

    在Visual C 的应用程序设置中 我们可以创建一系列具有特定Name Type Scope和Value的设置 我可以通过代码访问该值 string color Myproject Properties Settings Default
  • 比较 Go 模板中的两个变量

    在我传递给模板的数据中 我有两个变量Type and Res Type我想比较为我的选择字段预先选择一个选项 为了说明我的问题 我创建了这个简化版本 package main import bufio bytes html template
  • python 中的交互式输入

    以下是我需要执行的操作的说明 你要编写一个完整的程序 获取三段数据 然后对它们进行处理 这三条信息是布尔值 字符串和整数 程序的逻辑是这样的 如果布尔值为 True 则打印字符串两次 一次带双引号 一次不带 否则打印两倍的数字 这是我到目前
  • 动态 HTML 到 PDF [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要能够将动态 HTML 通过 javascript 在页面加载时呈现的 html 转换为 PDF 我
  • 从 WiX 提升的安装程序运行未提升的自定义操作

    我正在尝试弄清楚如何从提升的 WiX 安装设置程序运行自定义操作 WiX 生成的 msi 文件由 DotNetInstaller 执行 在 WiX 中 我有一个 Package 部分 其中 InstallScope 设置为 perMachi
  • Ajax 调用在 IE8 中不起作用

    我正在阅读几篇关于此的文章 并对我的代码进行了一些更改 但没有成功 任何人都可以调查一下 看看这里发生了什么 或者也许是另一种方法来完成我需要的事情 使用 ziptastic 通过邮政编码检索城市 州 该代码在 Chrome 中运行良好 h
  • __del__ 在程序结束时

    假设有一个程序 在运行时其中有几个对象 程序结束时是否调用每个对象的 del 方法 如果是的话 我可以做这样的事情 class Client del self disconnect from server 有许多潜在的困难 http doc
  • 从非托管 C++ 创建 DLL

    我目前有一个用非托管 C 编写的控制台应用程序 源代码由一个入口点组成main以及其他一些功能 我需要从此代码创建一个 DLL 以便我可以从其他项目 特别是托管 C 使用它 另一个问题 我是否必须为此目的编写一个包装类 由于我对托管 非托管