用 VC++ 生成 *.dll 后的 *.lib 在哪里?

Posted

技术标签:

【中文标题】用 VC++ 生成 *.dll 后的 *.lib 在哪里?【英文标题】:Where is *.lib after generating *.dll with VC++? 【发布时间】:2013-04-12 15:15:49 【问题描述】:

我用 VC++ 生成了一个 *.dll。当我想使用它时,需要 *.lib。但我找不到它。如何获取 *.lib?谢谢。

【问题讨论】:

这是旧的,但可能仍然相关(还包括更多链接):***.com/questions/584041/… 我相信它通常放在项目的$(OutDir)中(输出目录,通常是项目文件夹外的文件夹debugrelease。您可以将其更改为项目/链接器设置,如果需要的话。自从我使用默认值以来已经有一段时间了,因为我总是指定我的放置位置,所以你应该检查这个。编辑:从 MS 检查默认值:“默认名称是从基础形成的主输出文件的名称和扩展名 .lib。" 【参考方案1】:

除非您另外指定,否则.lib 将在与.DLL 相同的目录中生成。

如果你得到的是一个 dll 而不是一个 lib,那么很有可能你实际上并没有从 dll 中导出任何东西。在这种情况下,链接器会创建 dll,但不会自动创建匹配的导入库。

【讨论】:

+1 用于注意没有导出符号的无效创建(如果有人感兴趣,这也是in the documentation。请参阅第二个“备注”部分)。【参考方案2】:

这实际上取决于您的项目设置。

看看 *.vcprojx

并搜索相似的模式:

<link>
<ImportLibrary>.\Release/yourlibrary.lib</ImportLibrary>
</link>

【讨论】:

【参考方案3】:

通常,Visual Studio 将 .lib 放在 .dll 文件旁边。 您的案例听起来根本不会生成 .lib。将库构建为 dll 时,如果要在另一个项目中链接到该库(而不是使用 dllopen 等),则必须指定应将哪些函数导出到库中。为此,您必须在构建库时为要导出的所有类或函数添加 __declspec(dllexport),并在链接时添加 __declspec(dllimport)。

你经常会发现一些像这样的宏:

#ifdef WIN32
    #ifdef MYLIB_EXPORTS
        #define MYLIBAPI __declspec(dllexport)
    #else
        #define MYLIBAPI __declspec(dllimport)
    #endif
#else
    #define MYLIBAPI
#endif

然后,在构建 lib 时,您定义 MYLIB_EXPORTS 预处理器,以便它导出,同时链接到它导入。你自己的代码可能看起来像这样

class MYLIBAPI MyClass

public: 
    void SomeFunction()

MYLIBAPI void SomeGlobalFunction();

现在,MyClass 和 SomeGLobalFunction 在构建时被导出,并出现在 lib 文件中。

【讨论】:

以上是关于用 VC++ 生成 *.dll 后的 *.lib 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

是不是vc的dll,只要转化出c++builder的lib,c++builder就可以调用dll了

VC6.0 设置动态链接库工程生成dll以及lib文件的位置

cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效

DLL和LIB文件都是干啥用的?怎么用在VC++里面?

Visual Studio中怎么生成动态链接库的lib文件

halcon在VC++中,并生成dll文件,供MFC的EXE程序调用,dll中使用halcon函数出现报错