静态链接库是否需要链接到它们的依赖项?
Do statically linked libraries require linking with their dependencies?
我正在构建一个依赖于静态库 A 的可执行文件,而静态库 A 又依赖于静态库 B。当我构建我的应用程序时,我是否还需要 link 在我的构建脚本中针对 B ?
更具体地说,我需要做 -la -lb
,还是只需要 link 通过 -la
使用 A 就足够了?
静态库在编译时完全包含在使用程序中,因此它不需要任何额外的文件来运行程序。
如果库 A 已经使用静态库 B 构建,则 A 已经有了 B,不再需要它。
您可能需要也可能不需要 link 这两个库,具体取决于 A 的构建方式。
如果 A 包含一个 linker 注释记录,指示 linker 也在库 B 中查找符号(通常包含在 A 中包含的目标文件之一中),您不link 时不需要包含 B。如果 A 不包含该评论记录,您必须自己包含它。
如果 A 和 B 都是静态的,那么您必须 link 两者,顺序为 A 然后 B (-la -lb
)。有关订单的说明,请参阅 this reply。
静态 linked 程序包含其 linked 针对可执行文件内部的库。
假设您的程序在 A 内部调用 foo()
,而在 A 内部某处调用 bar()
。因此,如果 A 成为您程序的一部分,您就会在程序中对 bar()
进行未定义的调用,这就是为什么您也需要对 B link。
如@1201ProgramAlarm 所述,使用 special Visual Studio pragma (#pragma comment(lib, libname)
) 时除外。
我正在构建一个依赖于静态库 A 的可执行文件,而静态库 A 又依赖于静态库 B。当我构建我的应用程序时,我是否还需要 link 在我的构建脚本中针对 B ?
更具体地说,我需要做 -la -lb
,还是只需要 link 通过 -la
使用 A 就足够了?
静态库在编译时完全包含在使用程序中,因此它不需要任何额外的文件来运行程序。
如果库 A 已经使用静态库 B 构建,则 A 已经有了 B,不再需要它。
您可能需要也可能不需要 link 这两个库,具体取决于 A 的构建方式。
如果 A 包含一个 linker 注释记录,指示 linker 也在库 B 中查找符号(通常包含在 A 中包含的目标文件之一中),您不link 时不需要包含 B。如果 A 不包含该评论记录,您必须自己包含它。
如果 A 和 B 都是静态的,那么您必须 link 两者,顺序为 A 然后 B (-la -lb
)。有关订单的说明,请参阅 this reply。
静态 linked 程序包含其 linked 针对可执行文件内部的库。
假设您的程序在 A 内部调用 foo()
,而在 A 内部某处调用 bar()
。因此,如果 A 成为您程序的一部分,您就会在程序中对 bar()
进行未定义的调用,这就是为什么您也需要对 B link。
如@1201ProgramAlarm 所述,使用 special Visual Studio pragma (#pragma comment(lib, libname)
) 时除外。