从.lib文件创建.dll文件

3
在我提出问题之前,让我们先了解一下我的开发环境:
  • 操作系统:Windows 64位

  • 集成开发环境(IDE):Visual Studio 2013

我想通过一个C#项目来控制一个设备。我从设备制造商处获得了.h文件和静态库(.lib文件)。在C++控制台应用程序中,控制工作得很好。 但是现在我有一些问题要构建一个C#的DLL文件。

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

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

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

日志文件没有显示任何错误,但Debug(或Release)文件夹中没有DLL文件。

我尝试过:我添加了一个“虚假”的.cpp文件,在其中实现了.h文件中的一个函数 -> 构建了dll。因此,我想Visual Studio无法识别.lib文件。

下一步将是编写一个带有DllImport命令的C#“包装器”。

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


1
这可能会有所帮助。如果我的理解是正确的。https://dev59.com/D3RA5IYBdhLWcg3w8iol - Some Guy With a PC
很遗憾,我的问题在于构建dll,而不是使用它。这将是我在问题中提到的下一步。 - Blackbriar
请确保查看正确的文件夹,与C#不同,C++项目会构建到解决方案文件夹而非项目文件夹。但是,静态库并不是DLL的最佳选择。您需要一个.def文件,明确列出需要导出的特定函数。此外,请记住,您无法调用任何C++类实例方法或使用C++模板类型(如std::string)的任何函数,这需要使用C++/CLI编写包装器。 - Hans Passant
不存在所谓的“C++ DLL控制台应用程序”。它必须是一个dll项目。 - Robert Andrzejuk
@HansPassant 谢谢你,但那不是问题所在。我正在为我的函数添加__declspec(dllexport)标签。所以我不需要.def文件,对吧?而且我也没有尝试导出类实例方法或使用std::string等类似东西的函数。 @RobertAndrzejuk 新建项目 -> Visual C++ -> Win32控制台应用程序 -> 应用程序类型:DLL。希望这有助于理解。 - Blackbriar
1个回答

2
在Windows上,DLL中的函数不会自动导出,无论是在构建自身源文件(c/cpp)中的函数还是来自链接的静态库中的函数。
您可以通过将__declspec(dllexport)添加到函数声明中来导出它们,或者可以向项目中添加“模块定义文件(.def)”,并列出要导出的函数。例如,在此处,一个名为foo的函数可以从包含在我的DLL中的静态库中获得。
LIBRARY TEST
EXPORTS  
   foo @1 

如果项目没有实际的源文件,它根本不会创建文件。不确定微软是否认为这是一个错误或特性,但如果该项目没有实际的源文件,则不会创建DLL。您至少需要一个源文件,即使它是空的。


谢谢你的建议。我创建了一个空的.cpp文件,现在DLL已经被创建了。但是现在又出现了另一个问题,我将在回答中描述。 - Blackbriar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接