【问题标题】:Create MS Visual C++ DLL project out of existing sources从现有源中创建 MS Visual C++ DLL 项目
【发布时间】:2019-02-08 17:46:02
【问题描述】:

我的目标是将现有的 C++ 类(遗留代码,存储在一组 *.h 文件中)编译成 DLL,以便进一步集成到 C# 应用程序中。

为此,最好使用 MS Visual Studio。我对这种环境没有经验,所以我尝试了 MSDN 和其他 SO 答案上的幼稚方法:

  • 文件 |新 |从现有代码项目
  • 选定的 Visual C++
  • 选定的文件位置是包含在这些 .h 文件中使用的引用的基础
  • 指定项目名称
  • 让向导查找并添加目录下的所有 C++ 文件
  • 选择“使用 Visual Studio”进行构建,项目类型为“动态链接库 (DLL) 项目”
  • 未选中以下任何复选框(ATL、MFC、CLR)
  • 在调试设置的“包括搜索路径 (/I)”中指定 . 目录
  • 在“发布设置”中选中“与调试配置相同”
  • 点击完成按钮

这会在目录中创建几个 VS 文件:

mylibrary.sln
mylibrary.vcxproj
mylibrary.vcxproj.filters
mylibrary.vcxproj.user

以这种方式创建的项目,我按F6 或选择Build | Rebuild solution 来自菜单。

然后我希望构建在某处生成.dll 文件,但它没有出现。只显示这些文件:

.vs/mylibrary/v15/.suo
.vs/mylibrary/v15/Browse.VC.db
.vs/mylibrary/v15/Browse.VC.opendb
.vs/mylibrary/v15/ipch/AutoPCH/efad7c74cd39331b/EXAMPLE.ipch
Debug/mylibrary.log
Debug/mylibrary.tlog/mylibrary.lastbuildstate

接下来,我决定尝试创建一个全新的库项目,只是为了观察差异以获得一些提示,但这并没有帮助 - 差异太多,即使在文件结构中也是如此......

我的问题是:

  • 我选择的 MS Visual C++ 是否适合特定用途?
  • 如果是这样,我在这里做错了什么?

【问题讨论】:

  • 您不会将.h 文件编译到库中。而且您不能直接使用 C# 中的 C++ 代码。您应该(如果有的话)研究如何使用 C++/CLI。
  • 你的意思是后缀对 MS Visual C++ 很重要吗?我可以尝试将代码拆分为.cc.h,但我只是希望这不是必需的
  • 是的,但是您需要在某些内容中#include 这些标头,以便 VS 生成可执行文件/库 - VS 不直接编译 .h 文件。如果它在你不这样做的情况下在 Linux 上运行,那么你在 Linux 上的项目设计也是错误的。
  • 使本机代码可用于 .NET 的规范解决方案是包装功能并公开 .NET 接口。标准工具是 C++/CLI。虽然使用起来相当简单,但您必须了解细节。 C++/CLI in Action 是一个有用的指南。
  • 将代码编译到非托管库中不会更接近该目标。相反,创建一个混合模式程序集,它可以包含非托管的本机代码以及 .NET 可使用的接口。

标签: c++ visual-c++ dll


【解决方案1】:

我认为您的步骤可能是正确的,并且我认为使用 C# 应用程序中的代码的正确方法。您绝对可以通过导入方法从 C# 调用 C++ 库。

您只错过了从库中导出要使用的方法。尝试将 __declspec(dllexport) 与这些方法一起使用。请检查此链接:

https://msdn.microsoft.com/en-us/library/a90k134d.aspx.

另外,输出应该在构建文件夹,而不是源代码文件夹

【讨论】:

    【解决方案2】:

    .h 文件编译到库中是可以的,编译器不在乎 - 但是,UI 会。 不过,您可以通过直接编辑 .vcxproj 文件来调整它。

    执行此操作时,请确保 <ClCompile> 部分包含:

      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
    

    请注意,您可以使用命令行来构建 DLL 项目:

    "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" -target:Clean,Build
    

    (假设您的当前目录是您的.vcxproj 所在的目录)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多