关于C/C++静态库的推理

Has*_*yed 4 c++ build-process abi dynamic-linking static-libraries

我从来没有想过下面的问题,但由于我现在不得不在我的代码中处理一堆依赖项,我认为我最好直接了解我的事实.让我们将其限制为现代Linux版本,例如ubuntu amd64.

由于静态库不包含动态库引用,如何在静态库中解析未定义的符号?依赖二进制文件可以动态加载未定义的符号,还是编译时必须由另一个静态库或目标文件解析符号?

编译器是否可以通过链接动态库来解析(依赖于静态库的应用程序)的依赖关系,如果是这样,代码文本会通过静态解析为生成的二进制文件,还是存在动态引用?

例如,静态库L使用mallocfrom libc6.so,它将由应用程序使用A.将LA两者动态地使用libc6.so中的malloc吗?

小智 7

静态库只是一起存档的目标文件列表.

如何在静态库中解析未定义的符号?

它们没有被解析,因为没有未定义的符号.仅在链接阶段将符号视为未定义,并且在创建静态库时不会进行链接.

将二进制文件与静态库链接时,可能存在未定义的符号.在这种情况下,静态库被视为程序的一部分,因此所有对该静态库中使用的符号的引用必须在您构建的程序的范围内可用.比方说,如果程序A链接B到使用C来自其他库的符号的静态库D,那么程序A必须与B和链接D.

可以依赖二进制动态加载未定义的符号

是的,它可以.但除非你真的需要懒惰的动态分辨率,否则你不应该这样做.

或者必须在编译时由另一个静态库或目标文件解析符号

对象文件以及静态库不解析任何符号.它就是连接器.

可能编译器解决了......

编译器不解析任何依赖项.这是一个链接器的工作.可以在链接时解析依赖关系,也可以在动态链接器的运行时解析依赖关系.

依赖于(依赖于静态库的应用程序)依赖于动态库,...

链接器可以理解您使用的静态库取决于您链接的动态库中的符号.

如果是这样,代码文本将通过静态解析为生成的二进制文件,还是存在动态引用?

如果您链接到共享库,则程序中的任何内容都不会静态可用.这就是共享库的重点.唯一的例外是LTO.对于您链接的静态库,该静态库中的任何内容都不会动态可用,编译后会被删除,并且会删除那些未使用的符号.

例如,静态库L使用来自libc6.so的malloc,它将由应用程序A使用.L和A是否会动态使用libc6.so中的malloc?

是的,除非在malloc()编译静态库和编译器时由于某种原因可用的定义刚刚内联malloc()到静态库的代码中.但随着malloc()它不会发生.可能会与其他功能发生冲突.