【问题标题】:How do I build an import library (.lib) AND a DLL in Visual C++?如何在 Visual C++ 中构建导入库 (.lib) 和 DLL?
【发布时间】:2010-10-09 16:50:17
【问题描述】:

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

于是我去了Visual Studio C++ 2008 Express Edition,新建了一个类库类型的新项目,并将“配置类型”设置为“动态库(.dll)”。

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

我相信可以同时构建 LIB 和 DLL 文件,因为on the MSDN it says "The linker creates the import library when the DLL is built." 还有another user of this website is creating LIB and DLL files at the same time using Visual C++

那我该怎么做呢?

【问题讨论】:

  • 我刚刚遇到了我的 .lib 文件没有生成的确切问题。在谷歌搜索所有信息后,我可以找到可能的原因并仔细阅读下面的所有答案,我终于发现这是因为我的 .cpp 文件不包含我的 .h 文件。 :( 只是把它扔在这里,如果我的愚蠢错误在遥远的将来重复出现,我的评论可以(以很小的可能性)帮助某人/我自己......

标签: c++ visual-studio dll import


【解决方案1】:

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

在 VS 的非 Express 版本中,导入库名称在此处的项目设置中指定:

Configuration Properties/Linker/Advanced/Import Library

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

【讨论】:

  • 感谢 Michael,在我的情况下 lib 没有生成,因为没有导出。
  • 好的,这是什么意思?我在我的 dll 项目上指定了导入库,但它仍然没有创建 dll。我把它放在使用我的 DLL 的项目上,它也没有导致它被构建。我正在使用 Visual C++ 2010 Express
  • 你能澄清一下吗?单独指定导入库似乎不会生成 .lib 文件。
  • @Will:你有没有标有__declspec(dllexport)属性的函数?
  • 注意初学者:导入库不是静态库,即使两者都是.lib。 More info on this answer.
【解决方案2】:

好的,所以我从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 向导上的“导出符号”框或对计算机程序员的脑叶切除术投“是”来防止此问题。

【讨论】:

  • 你可以编辑它,使它不是你其他答案的精确副本吗?使它适用于这个问题是一个很好的起点。谢谢。
  • 已修复,威尔。我不小心把这个答案贴到了这个页面上。我现在已经清理了我的烂摊子。感谢您关注我。
  • 截至 2017 年 9 月的死链接
  • @ToastyMallows 这就是为什么我详细解释了我的答案,以防链接消失。
【解决方案3】:

通过选择“类库”,您不小心告诉它使用 C++ 的 CLI(托管)扩展创建一个 .Net 库。

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

如果你想走这条路,你也可以从这些库选择中创建一个 MFC DLL 或 ATL DLL,但听起来你不这样做。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • VS2010中位于Configuration Properties/Linker/Input/Module Definition File
    • 如何创建定义文件?里面有什么?
    • 谢谢你……这让我很难受。
    • @ThomasMatthews 如果您转到添加新项目 - 代码 - 模块定义文件 (.def),这是一种文件类型。如果通过 VS 添加,它大概会将定义文件添加到此处答案中的设置中。就我而言,.def 是预先存在的。
    • @RichardHein: A Module-Definition (.Def) File "向链接器提供有关导出、属性和其他有关要链接的程序的信息。" 其中包括允许您指定从 DLL 导出(有关详细信息,请参阅 Exporting from a DLL Using DEF Files)。
    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 2021-05-30
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多