【问题标题】:Create a .dll file form a .lib file从 .lib 文件创建 .dll 文件
【发布时间】:2018-10-01 13:45:17
【问题描述】:

在我问我的问题之前,这里有一些关于我的开发环境的信息:

  • 操作系统:Windows 64 位

  • IDE:Visual Studio 2013

我想通过 C# 项目控制设备。我从设备制造商那里得到的:一个 .h 文件和一个静态库(.lib 文件)。在 C++-Console-Application 中,控制工作正常。 但是现在我在为 C# 构建 DLL 时遇到了一些问题

为了构建这样的 .dll 文件,我创建了一个空的 C++ DLL 控制台应用程序,将 .h 文件复制到项目中并将 .lib 文件引用到链接器(添加了“附加库方向”和解决方案设置中的“附加依赖项”)。

但是到了这一步,问题就出现了。当我构建项目时,控制台打印

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

日志文件没有显示任何错误,但调试(或发布)文件夹中没有 DLL 文件。

我尝试了什么:我添加了一个“假”.cpp 文件,我在其中实现了 .h 文件中的一个功能 -> 构建了 dll。所以我猜Visual Studio不能识别.lib文件。

下一步是使用 DllImport 命令编写 C#“包装器”。

提前感谢您的所有回答和提示。

【问题讨论】:

  • 这可能会有所帮助。如果我的理解是正确的。 stackoverflow.com/questions/772041/using-c-library-in-c-sharp
  • 遗憾的是没有。我的问题在于构建 dll,而不是使用它。这将是我在问题中提到的下一步。
  • 查看正确的文件夹,与 C# 不同,C++ 项目构建到解决方案文件夹,而不是项目文件夹。但可以肯定的是,静态库对于 DLL 来说并不是一个好的开始。您需要一个明确列出需要导出的特定函数的 .def 文件。另外请记住,您不能调用任何 C++ 类实例方法或任何使用 C++ 模板类型(如 std::string)的函数,这需要用 C++/CLI 编写的包装器。
  • 没有“C++ DLL Console-Application”这样的东西。它必须是一个 dll 项目。
  • @HansPassant 谢谢,但这不是问题所在。我正在将__declspec(dllexport) 标签添加到我的函数中。所以我不需要 .def 文件,对吗?而且我不想导出使用 std::string 或类似内容的类实例方法或函数。 @RobertAndrzejuk 新项目 -> Visual C++ -> Win32 控制台应用程序 -> 应用程序类型:DLL。希望这有助于理解。

标签: c# c++ visual-studio


【解决方案1】:

在 Window 上,函数不会自动从 DLL 中导出,无论是在构建自己的源文件 (c/cpp) 中还是从链接的静态库中导出。

您可以通过将__declspec(dllexport) 添加到函数声明来导出它们,或者您可以将“模块定义文件(.def)”添加到项目中,并列出要导出的函数。例如,这里的函数foo 可以来自我的 DLL 中包含的静态库。

LIBRARY TEST
EXPORTS  
   foo @1 

因为它根本没有创建文件,不确定 MS 是否认为它是一个错误或功能,但如果项目没有实际的源文件,它不会创建 DLL。你至少需要一个,它甚至可以是空的。

【讨论】:

  • 感谢您的提示。我创建了一个空的 .cpp 文件,现在创建了 DLL。但是现在出现了另一个问题,我将在问题的答案中描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多