从非托管 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 的相关文章

  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 在桌面应用程序中,类库的连接字符串存储在哪里?我可以在app.config中使用吗?

    我是桌面应用程序开发的新手 目前正在使用分层架构 用户界面 DAL BLL 构建桌面应用程序 在 Web 开发中 我曾经将连接字符串存储在 web config 中 我的类库从那里访问它 请指导我在桌面应用程序中如何以及在何处存储 DAL
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 如何从 List 中的字符串中删除数字/数字?

    我有一个字符串列表 List
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 在 try catch 块中返回到 catch 内是否不好?这是很好的做法

    在 try catch 块中从 C 中的 catch 块返回值是不好的做法吗 try Some code return 1 catch return 0 哪种使用 try catch 的方法是好的做法 不需要 只要返回的值是你想要的 你可以
  • target_link_libraries 和 INCLUDE_DIRECTORIES 属性

    在这个片段中 cmake minimum required VERSION 3 0 project hello LANGUAGES C VERSION 0 0 1 add library a INTERFACE target include
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 在代码中而不是 XAML 中呈现 UserControl

    我想用RenderTargetBitmap将 UserControl 呈现为位图 而无需为其编写 XAML 当我这样做时 我得到一张空白图像 我是否错过了关键的一步 ValTool Controls VideoFisheyeOverlayC

随机推荐

  • 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 使用它 另一个问题 我是否必须为此目的编写一个包装类 由于我对托管 非托管