我最近使用的Visual Studio 2008项目遇到了一个奇怪的问题。
我正在尝试编译一个使用另一个静态库中的函数的新静态库。 (假设Lib1是我的静态库项目,Lib2是Lib1依赖的lib文件)。
我可以毫无问题地构建lib1;它包含lib2的头文件并调用它的函数,没有问题。
问题是当我构建一个以Lib1作为依赖项的单独测试项目时;它不会构建,我会收到链接器错误。未解析的外部是我试图在Lib1中调用来自Lib2的函数。
当我在我的测试项目中包含Lib2时,这一切都已修复。
这当然对我来说都是有意义的;我可以测试Lib2没有内置到Lib1 ..
我的问题是:有办法做到这一点吗?理想情况下,我希望能够将Lib1部署为独立的lib而不需要Lib2。 (Lib2实际上只是来自Windows平台SDK的Lib,所以它并不是什么大不了的......)
这是不允许的,因为它允许人们“隐藏”他们自己的第三方图书馆,或者什么?
这个问题的专业方法是什么?
谢谢!
--R
我不建议使用图书管理员将Windows的图书馆内容带入您自己的图书馆 - 这可能是违反许可证的。
我看到两种可能性
- 记录依赖关系
- 在.h文件中使用#pragma请求链接.lib。如果VS可以找到它,它就像在链接线上包含它一样。
http://msdn.microsoft.com/en-us/library/7f0aews7(VS.80).aspx
#pragma comment(lib, "libname.lib")
您需要使用名为库管理器的工具来执行此操作。图书管理员允许您创建和修改库(.lib)文件。在Visual Studio中检查项目属性的Librarian部分。命令行版本还附带visual studio(lib.exe)。
只记录lib的依赖关系。
只要您所依赖的库可供任何可以使用您的库的人使用,这是首选解决方案。特别是考虑到图书馆用户可以 也 取决于这个平台SDK lib - 如果你嵌入了它,那么他会用多重定义的符号得到有趣的链接器错误。
这是一个相当正常的问题 - 你通常不会尝试将'lib2'包含在'lib1'中,而只是简单地说明为了工作需要链接它。声明使用其他库(当然除了任何许可问题)没有任何问题,因此您已经做了正确的事情。
如果你真的想这样做,你可以从Lib2中提取.obj文件并将它们添加到Lib1。
看到 如何使用LIB.EXE从.LIB文件中提取.OBJ例程 - 我希望它仍然与VS2008相关。
而不是简单地记录您的依赖项,请使用 #pragma comment(lib, 'lib2name')
在您的代码中,使链接器自动拉入另一个库。由于您说您使用的是SDK附带的标准库,因此可以消除应用程序的所有负担。