用 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)中(输出目录,通常是项目文件夹外的文件夹debug
或release
。您可以将其更改为项目/链接器设置,如果需要的话。自从我使用默认值以来已经有一段时间了,因为我总是指定我的放置位置,所以你应该检查这个。编辑:从 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文件的位置