如何在VS2015中将外部库依赖项链接到一个静态库文件中

How to link your external library dependencies into one static library file in VS2015

本文关键字:文件 一个 静态 项链 VS2015 外部 依赖 链接      更新时间:2023-10-16

情况就是这样。

我有一个库项目a,它使用和操纵其他第三方库,我们称它们为T1和T2。

然而,当我在任何其他项目中使用此库A时,它抱怨它无法打开第三方库T1和T2,即使它没有直接使用它们。当然,它通过库A间接使用它们,因为A做了适当的工作来链接和包括针对该库等的

我真的需要把这些其他库添加到使用库A的项目中吗?或者有没有一种方法可以连接库,这样库A的用户只需要担心那个库,而不需要担心它是由什么组成的。

编辑:

发现了一些相关的问题,但答案并不能完全解决问题

将静态库链接到其他静态库

如何将多个c-c库合并到一个中

第2版:

谢谢你到目前为止的回答。让我澄清一下我的情况。

我在VS2015中有一个.lib项目,我们称之为MathLib。这个MathLib在内部使用boost库来进行计算,并调用这个库BoostPath。属性文件都设置为包含并使用此BoostPath,这在库项目本身中非常有效。

我现在正在制作另一个项目User,它使用MathLib进行计算。使用此库会执行适当的includes和all操作。然而,它抱怨说,它不知道BoostPath库,因此无法使用MathLib程序库。

有人可能会争论,为什么不像MathLib库那样,将BoostPath包含到项目User中,但这没有抓住重点。我想创建一个自己的库,可以在内部使用也可以不使用其他库,但这不应该引起我的库的最终用户的任何担忧。

我可能需要在VS库管理员中设置一些东西来实现这一点,将库连接在一起或一些。但我似乎想不通。有什么想法吗?

第3版:我甚至在属性文件中找到了与这个答案中提到的完全相同的命令行。

/OUT:"MathLib.lib" "BoostMath.lib" /NOLOGO /LIBPATH:"pathlib" 

然而,由于某些原因,它不起作用。如果我在使用和不使用Librian属性设置的情况下运行它,.lib二进制文件将保持不变。

自VS2010以来,此功能似乎已损坏?根据这个答案。另一个有用的问题。第4版:

我基本上想这样做,但它似乎在VS2015 中不起作用

+---------------+
| End user exe  |
+---------------+
       |
       | some api call
       |
+---------------+
| My MathLib    |
+---------------+
       |
       |
       +---------------+------------+----
       |               |            |
 +-----+------+  +-----+-----+
 | BoostMath  |  | OtherMath |
 +------------+  +-----------+

我不确定如何将库链接到项目。。。但它不应该抱怨编译器无法打开库T1和T2,除非您已将它们包含在编译器设置中。

通常,如果你没有库,它会报告找不到函数示例T1_xxxx(该函数在T1中定义)。我建议您检查项目的编译器设置

基本上静态库不进行链接,尤其是静态库无法指定自己的依赖项。你可以通过在单个obj文件(即单个源文件)周围传播#pragma comment(lib)来部分解决这个问题,但不能在库级别传播——而且你似乎无论如何都不打算修改lib源。

您的最佳选择似乎是将lib及其依赖项组合到一个单独的lib中,如所指定的,例如:

lib.exe/OUT:compositelib.lib lib1.lib lib2.lib

请注意,每当任何依赖项发生更改时,都必须重新打包。作为一名用户,我自己更希望在我的消费者解决方案中包含所有引用的lib。