我构建依赖于静态库A的可执行文件,而静态库A依赖于静态库B.当我构建应用程序时,是否还需要在构建脚本中链接B?
更具体地说,我是否需要执行-la -lb
,或者仅通过-la
与A联系就足够了?
答案 0 :(得分:3)
根据A的构建方式,您可能也可能不必与两个库建立链接。
如果A包含链接器注释记录,指示链接器也在库B中查找符号(通常包含在A中包含的一个目标文件中),则链接时不需要包含B.如果A不包含该评论记录,则必须自己包含该记录。
答案 1 :(得分:0)
如果A和B都是静态的,那么你必须按A和B(-la -lb
)的顺序链接它们。有关订单的说明,请参阅this reply。
静态链接程序包括与可执行文件内部链接的库。
想象一下你的程序在A里面调用foo()
,在A里面的某个地方调用bar()
。因此,如果A成为您的程序的一部分,那么您在程序中对bar()
进行了未定义的调用,这也是您需要与B链接的原因。
例外情况是@ 1201ProgramAlarm提到的使用special Visual Studio pragma(#pragma comment(lib, libname)
)时。
答案 2 :(得分:-1)
静态库在编译期间完全包含在使用程序中,因此它不需要任何其他文件来运行程序。
如果库A已经使用静态库B构建,则A已经具有B并且不再需要它。