.lib文件未被创建(VS2008)

11

我向我的解决方案中添加了一个dll项目,并通过执行项目显式引用了它。 可执行文件抱怨找不到lib文件。

有什么想法可以设置项目以创建所需的lib文件吗? 可能是什么原因导致项目未创建文件?!

干杯

注意事项 我已经搜索了项目,无处创建该文件。

4个回答

12
在DLL项目的链接器 -> 高级属性选项卡中,验证导入库的值(您要查找的.lib文件)是否正确/合理。该属性的值将确定导入库的名称以及链接器将其写入的位置。
您可能还需要在项目中生成一个导入定义文件(.def),或者检查您的头文件,并确保在头文件中标记了导出函数,标记方式为__declspec(dllexport)限定符。这通常是通过#define进行切换的:
#ifdef MYAPI_EXPORTS
#define MYAPI_API __declspec(dllexport)
#else
#define MYAPI_API __declspec(dllimport)
#endif

void MYAPI_API foo(int bar);

你希望编译器在构建库时看到dllexport,但在客户端代码包含头文件时看到dllimport。如果Visual Studio生成了基本的项目结构,则可能已经创建了适当的#define可供使用。

您不必同时创建.def文件和添加dllexport,只需选择其中一个即可。我更喜欢后者。另外,如果您选择使用.def文件,则需要在库项目的链接器属性中指定它。


该值被设置为$(TargetDir)$(TargetName).lib,这与我在项目中使用的其他dlls的值相同,它们可以正常工作。 - Adam Naylor
这真的很奇怪,你能手动添加命令行开关(在命令行属性表中)来指定导入库吗?例如 /IMPLIB:C:\MyDll.lib? - Jeremy
我已经在链接器命令行和编译器命令行中都添加了开关,但指定的文件还没有被创建……它似乎拒绝创建库!?! - Adam Naylor
并非想冒犯,但可能您误打了C++/CLI项目,该项目不会生成.lib文件。 - Jeremy
谢谢,我的导出确实有问题! - Adam Naylor
显示剩余2条评论

4
我以前见过这种情况。最近又遇到了。如果没有导出任何东西,就不会创建.lib文件。导出函数有两种方法。
1)使用__declspec(dllexport)标记一个函数。
或者
2)使用.def文件列出所有要导出的函数。
解决方案:
1)通常需要设置编译时标志来激活预处理器块,将一些#define设置为__declspec()。其他人在他们的帖子中列出了这一点。
2)需要设置行属性->链接器->输入->模块定义文件。

1
你在项目属性->链接器->输入选项卡中是否包含了lib文件?
同时,确保你在链接器选项卡中包含了额外的引用。

我已经做了,但因为它没有被创建,所以这是一个无意义的点? - Adam Naylor
编译器在构建lib文件时是否抛出了任何错误? 请检查$(OutDir)$(ProjectName)位置以获取lib文件。 - Vinay
除了一个抱怨库文件不存在的错误之外,没有任何错误被抛出,而且该库在项目中也不存在。 - Adam Naylor

1

检查构建 DLL 的项目。如果它没有生成 .lib 文件,那么你可能没有告诉它生成。你可以在“属性”->“常规”->“配置类型”中将项目的输出从 DLL 更改为静态库(选择 Static Library .lib)。


你假设一个人可以/想要改变项目类型。 我的理解是,dll(不是动态链接的)必须创建libs。否则它们就没有用处了? - Adam Naylor
如果是这种情况,那么你的属性仍然有误。你需要检查你的.lib文件放在哪里。如果问题只是这个,那么请检查属性->链接器->导入库,并查看你正在创建lib文件的位置。 - Matt Jordan
它被设置为$(TargetDir)$(TargetName).lib,这与解决方案中其他正常工作的dll的设置相同。 - Adam Naylor
然后进行简单的调试步骤 - 将其设置为已知路径,例如 .\Test.lib。这将告诉您是否只是路径问题。 - Matt Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接