c++ 从 dll 导入函数 - 我的 dll 不导出 lib
c++ import functions from dll - my dll doesn't export lib
我想创建一个导出函数和结构的 dll。我经历了 walkthrough,这是我所拥有的:
myDll 项目:the_dll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
typedef struct MyStruct
{
bool b;
} MYSTRUCTTYPE, *PMYSTRUCTTYPE;
typedef const MYSTRUCTTYPE *MYCSTRUCTTYPE;
MYDLL_API bool dllF();
myDll 项目:the_dll.cpp
#include the_dll.h
bool dllF() { return true };
在myDll项目的预处理器定义中,我定义了MYDLL_EXPORTS
在链接器 -> 高级 -> 导入库中我看到 $(OutDir)$(TargetName).lib
但是没有生成lib,只有dll和pdb
Intellisense 显示 MYDLL_EXPORTS
为 __declspec(dllexport)
并且 dllimport
部分显示为灰色...所以我必须导出...
我已经包含了依赖的 header 文件,并在调用者项目中设置了额外的库目录和额外的包含目录,以及依赖库。但是......在没有lib的情况下......
需要此 dll 中的函数的项目给出未解析的外部符号错误。
如何让我的 dll 创建一个库?我错过了什么? (或者...我如何在不链接到库的情况下使用它的功能并包含 header ?)
注意:我假设不需要导出结构和类型定义...是吗?
更新:正如我在评论中所写,当我将项目导入不同的解决方案并删除所有调试文件夹时,项目确实创建了一个库......我一直"Build -> Clean Solution" 两次尝试之间,但我想有些东西没有得到清理......
所以没有创建库的真正原因是(我的猜测),在试验代码时和添加 MYDLL_EXPORTS
的定义之前,创建的文件没有被清理......在以后重试之前,我总是会删除构建文件夹。
我在 VS2013 中检查了一个小测试项目。它在 Debug 目录中为我的两个 DLL 生成了 .lib 文件。这意味着如果设置没有搞砸,使用默认设置,您应该在构建 DLL 后拥有 implib。
事实上,只有当您要将您的dll 分发给客户时,您才需要.lib 文件。如果你想在其他项目的同一个解决方案中使用这个 dll,请执行以下操作:
- Select 您要导入函数的项目。
- 在顶部菜单中单击项目->参考....
- 单击中间底部的按钮 "Add New Reference"。
- Select 个您要从中导入的 dll。
- 单击确定关闭所有对话框。
- 重建您的解决方案。
无法导出结构。它们使用 header 文件与其他二进制文件通信。您只能导出函数入口点(包括 class 成员函数)和静态数据字段。您应该将 header 包含到您的 dll 代码和所有使用您的 DLL 的应用程序中。 #ifdef MYDLL_EXPORTS
正是这个目的。
我想创建一个导出函数和结构的 dll。我经历了 walkthrough,这是我所拥有的:
myDll 项目:the_dll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
typedef struct MyStruct
{
bool b;
} MYSTRUCTTYPE, *PMYSTRUCTTYPE;
typedef const MYSTRUCTTYPE *MYCSTRUCTTYPE;
MYDLL_API bool dllF();
myDll 项目:the_dll.cpp
#include the_dll.h
bool dllF() { return true };
在myDll项目的预处理器定义中,我定义了MYDLL_EXPORTS
在链接器 -> 高级 -> 导入库中我看到 $(OutDir)$(TargetName).lib
但是没有生成lib,只有dll和pdb
Intellisense 显示 MYDLL_EXPORTS
为 __declspec(dllexport)
并且 dllimport
部分显示为灰色...所以我必须导出...
我已经包含了依赖的 header 文件,并在调用者项目中设置了额外的库目录和额外的包含目录,以及依赖库。但是......在没有lib的情况下...... 需要此 dll 中的函数的项目给出未解析的外部符号错误。
如何让我的 dll 创建一个库?我错过了什么? (或者...我如何在不链接到库的情况下使用它的功能并包含 header ?)
注意:我假设不需要导出结构和类型定义...是吗?
更新:正如我在评论中所写,当我将项目导入不同的解决方案并删除所有调试文件夹时,项目确实创建了一个库......我一直"Build -> Clean Solution" 两次尝试之间,但我想有些东西没有得到清理......
所以没有创建库的真正原因是(我的猜测),在试验代码时和添加 MYDLL_EXPORTS
的定义之前,创建的文件没有被清理......在以后重试之前,我总是会删除构建文件夹。
我在 VS2013 中检查了一个小测试项目。它在 Debug 目录中为我的两个 DLL 生成了 .lib 文件。这意味着如果设置没有搞砸,使用默认设置,您应该在构建 DLL 后拥有 implib。
事实上,只有当您要将您的dll 分发给客户时,您才需要.lib 文件。如果你想在其他项目的同一个解决方案中使用这个 dll,请执行以下操作:
- Select 您要导入函数的项目。
- 在顶部菜单中单击项目->参考....
- 单击中间底部的按钮 "Add New Reference"。
- Select 个您要从中导入的 dll。
- 单击确定关闭所有对话框。
- 重建您的解决方案。
无法导出结构。它们使用 header 文件与其他二进制文件通信。您只能导出函数入口点(包括 class 成员函数)和静态数据字段。您应该将 header 包含到您的 dll 代码和所有使用您的 DLL 的应用程序中。 #ifdef MYDLL_EXPORTS
正是这个目的。