来自dll的c ++导入函数 - 我的dll不导出lib

时间:2015-02-03 20:45:07

标签: c++ dll linker dependencies shared-libraries

我想创建一个导出函数和结构的DLL。我经历了walkthrough,这就是我所拥有的:

Project 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();

Project 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部分显示为灰色...所以我必须要导出...

我已经包含了从属头文件,并在调用者项目中设置了其他库目录和其他包含目录以及从属库。但是......在没有lib的情况下...... 需要此dll中的函数的项目会给出未解决的外部符号错误。

如何让我的dll创建一个lib?我错过了什么? (或者......如何在不链接到lib并包含标题的情况下使用其功能?)

注意:我假设不需要导出结构和typedef ......是吗?

更新:正如我在评论中写的那样,当我将它导入不同的解决方案并擦除所有调试文件夹时,该项目确实创建了一个库...我一直在“构建 - >清理解决方案“尝试之间,但我想有些事情没有得到清理......

所以没有创建lib的真正原因是(我的猜测),在尝试代码时和添加MYDLL_EXPORTS的定义之前,创建的文件没有得到清理......我会始终在再次尝试之前删除构建文件夹。

1 个答案:

答案 0 :(得分:1)

我在VS2013中检查了一个小型测试项目。它为Debug目录中的两个DLL生成了.lib文件。这意味着如果设置没有搞砸,使用默认设置,您应该在构建DLL后使用implib。

事实上,只有在想要将dll分发给客户时才需要.lib文件。如果要在其他项目的同一解决方案中使用此dll,请执行以下操作:

  1. 选择要导入功能的项目。
  2. 点击顶部菜单,点击PROJECT->参考....
  3. 点击中间底部的“添加新参考”按钮。
  4. 选择要从中导入的dll。
  5. 单击“确定”关闭所有对话框。
  6. 重建您的解决方案。
  7. 无法导出结构。它们使用头文件传递给其他二进制文件。您只能导出函数入口点(包括类成员函数)和静态数据字段。您应该将头文件包含在dll代码和使用DLL的所有应用程序中。 #ifdef MYDLL_EXPORTS正是出于这个目的。