如何在Visual C ++中构建导入库(.lib)和DLL?


75

我想要一个构建DLL文件和导入库(.lib)文件的Visual Studio项目。(导入库是静态链接的库,负责在使用该DLL文件的其他项目中加载该DLL文件)。

因此,我去了Visual Studio C ++ 2008 Express Edition,创建了类库类型的新项目,并将“配置类型”设置为“ Dyanamic库(.dll)”。

但是,当我构建解决方案时,我看到的唯一相关的输出文件是DLL文件。我看不到生成任何LIB文件。我查看了项目目录和所有子目录(发布和调试)。

我相信可以同时构建LIB和DLL文件,因为在MSDN上显示“链接程序在DLL生成时会创建导入库”。 另外,该网站的另一个用户正在使用Visual C ++同时创建LIB和DLL文件

那我该怎么办呢?


4
我只是遇到了这个确切的问题,即我的.lib文件没有生成。仔细阅读所有信息后,我可以找到可能的原因,并仔细查看以下所有答案,最终我发现这是因为我的.cpp文件未包含我的.h文件。:(只是把它扔在这里,以便我的评论可以(以很小的可能性)在某个遥远的未来再次犯我愚蠢的错误时可以帮助某人/我自己……
user1884905 2014年

Answers:


24

通过选择“类库”,您无意中告诉它使用C ++的CLI(托管)扩展来创建.Net库。

而是创建一个Win32项目,然后在下一页的“应用程序设置”中选择“ DLL”。

如果您想走那条路线,也可以从这些库选择中制作MFC DLL或ATL DLL,但这听起来像您不希望这样做。


84

您的DLL项目是否有实际出口?如果没有导出,则链接器将不会生成导入库.lib文件。

在VS的非Express版本中,导入libray名称在以下项目设置中指定:

Configuration Properties/Linker/Advanced/Import Library

我认为Express中是相同的(如果它甚至提供了配置名称的功能)。


7
谢谢Michael,在我的情况下,由于没有导出,所以没有生成lib。
Uday

4
好,那是什么意思?我在dll项目上指定了导入库,但它仍然没有创建dll。我把它放在使用我的DLL的项目上,它也没有导致它被构建。我正在使用Visual C ++ 2010 Express
Thom

3
您能对此澄清一下吗?仅指定导入库似乎不会生成.lib文件。
将Tice Tice 2012年

11
@Will:您是否有标有该__declspec(dllexport)属性的功能?
Michael Burr 2012年

4
对初学者要当心:导入库不是静态库,即使两者都是.lib。有关此答案的更多信息
KrisWebDev 2015年

38

好的,所以我从http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/找到了答案,说这个问题这是由于未导出任何符号引起的,并进一步说明了如何导出符号以创建lib文件。这样做,将以下代码添加到您的DLL的.h文件中。

#ifdef BARNABY_EXPORTS
#define BARNABY_API __declspec(dllexport)
#else
#define BARNABY_API __declspec(dllimport)
#endif

其中BARNABY_EXPORTS和BARNABY_API是项目的唯一定义。然后,您导出的每个函数仅需先执行以下操作:

BARNABY_API int add(){
}

通过单击新项目DLL向导上的“导出符号”框,或对计算机程序员的机体投票“是”,可以避免此问题。


您可以对其进行编辑,以使其与其他答案不完全相同吗?使它适用于这个问题是一个很好的起点。谢谢。

固定,意志。我不小心将该答案发布到了此页面。我现在清理了我的烂摊子。谢谢你的监督
汤姆(Thom)

2
截至2017
固定

@ToastyMallows这就是为什么我详细解释我的答案的原因,以防链接消失。
汤姆(Thom)

9

您还应该在此处的项目设置中指定def名称:

配置>属性/输入/高级/模块>定义文件


6
位于VS2010中Configuration Properties/ Linker/ Input/Module Definition File
Pakman 2011年

一个如何创建定义文件?里面有什么?
Thomas Matthews

谢谢...这把我逼到了墙。
理查德·安东尼·海因

2
@ThomasMatthews如果您要添加新项-代码-模块定义文件(.def),则为文件类型。如果通过VS添加,它可能会将定义文件添加到此处答案的设置中。就我而言,.def是预先存在的。
理查德·安东尼·海因

@RichardHein:模块定义(.Def)文件 “为链接器提供有关导出,属性和其他有关要链接程序的信息。 ”其中,它还允许您指定DLL的导出(请参见有关详细信息,请使用DEF文件从DLL导出)。
IInspectable
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.