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