2017-04-03 97 views
2

我正在构建一个依赖于静态库A的可执行文件,而静态库A又取决于静态库B.当我构建我的应用程序时,是否还需要在构建脚本中链接B?静态链接库是否需要链接它们的依赖关系?

更具体一点,我需要做-la -lb,还是只通过-la连接A就够了?

+0

在哪个操作系统上? –

+0

@BasileStarynkevitch Linux。 – jeffreyveon

+0

这应该进入问题(也许作为标签)。 –

回答

2

根据A的构建方式,您可能需要也可能不需要链接两个库。

如果A包含链接器注释记录,指示链接器也在库B中查找符号(通常包含在A中包含的一个对象文件中),则链接时不需要包含B.如果A不包含该评论记录,则必须自己包含它。

-1

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

如果库A已经与静态库B一起构建,则A已经拥有B并且不再需要它。

+0

我不认为这是正确的。静态库仍然可能存在未解决的依赖关系,链接器将会抱怨。在编译期间,每个库在库编译阶段至少需要访问其依赖库的头文件,但是不会尝试链接到相关库,因为这可能会导致项目包含相同库的多个副本,静态库项目没有链接阶段。 – PaulHK

+0

@PaulHK什么时候编译完成的静态库A会抱怨什么?如果A已经编译完成,则B的部分完成。要在某个完整的程序中使用A,必须进行编译。 – deviantfan

+2

图书馆A不会抱怨它的依赖关系,除非它包含在具有链接器传递的项目中。编译一个库不需要链接到任何相关的库,因此为什么我提到库只需要访问相关的库头,而不是它的目标文件。 – PaulHK

0

如果A和B都是静态的,则必须按A和B的顺序(-la -lb)连接两者。请参阅this reply了解订单的说明。

静态链接的程序包括链接到可执行文件内部的库。

想象一下,您的程序在A内部调用foo(),并在A的某个地方调用bar()。所以如果A成为你的程序的一部分,你的程序中有一个未定义的bar()调用,这就是为什么你需要链接到B的原因。

例外情况是使用special Visual Studio pragma#pragma comment(lib, libname)),如@ 1201ProgramAlarm所述。