静态链接库需要与它们的依赖项链接吗?

6
我正在构建一个依赖于静态库A的可执行文件,而静态库A又依赖于静态库B。当我构建我的应用程序时,是否需要在我的构建脚本中链接B呢?
更具体地说,我需要执行`-la -lb`吗?还是只需要通过`-la`链接A就足够了?

在哪个操作系统上? - Basile Starynkevitch
@BasileStarynkevitch Linux。 - jeffreyveon
应该将这个内容放到问题中(可能作为标签)。 - Basile Starynkevitch
3个回答

4

根据A库的构建方式,您可能需要链接两个库中的一个或两个,具体情况取决于A库的构建方式。

如果A库包含链接器注释记录,指示链接器在库B中查找符号(通常包含在A库中的其中一个目标文件中),则在链接时不需要包含库B。如果A库不包含该注释记录,则必须自行包含库B。


在构建库时,链接器包含还是不包含注释记录更好的做法? - nwfistere

1
如果A和B都是静态的,则必须按照A然后B的顺序进行链接(-la -lb)。有关顺序的解释,请参见this reply
静态链接程序将其链接到的库包含在可执行文件中。
想象一下,您的程序在A中调用foo(),并且在A的某个地方调用了bar()。因此,如果A成为您的程序的一部分,则您的程序中就会出现对bar()的未定义调用,这就是为什么您需要链接到B的原因。
唯一的例外是使用特殊的Visual Studio pragma#pragma comment(lib, libname)),如@1201ProgramAlarm所提到的。

-2

静态库在编译时完全包含在使用程序中,因此运行程序时不需要任何额外的文件。

如果库A已经与静态库B构建,那么A已经具备了B的功能,不需要再次引入。


1
我认为这不是正确的。一个静态库仍然可能有未解决的依赖关系,链接器会抱怨。每个库在编译期间都需要访问其依赖库的头文件,但不会尝试链接到依赖库,因为这可能会导致项目包含多个相同库的副本,静态库项目没有链接阶段。 - PaulHK
@PaulHK 那么A这个已经编译好的静态库什么情况下会抱怨呢?如果A已经编译好了,那B的部分也就完成了。要在某个完整程序中使用A,必须进行编译。 - deviantfan
3
只有当Library A被包含在进行链接器传递的项目中时,它才会抱怨其依赖关系。编译库不需要连接到任何依赖库,因此我提到该库仅需要访问依赖库头文件,而不需要其目标文件。 - PaulHK

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