<分区>
我有一个 C++ 项目,分为多个库目标和一个可执行目标。我一直在动态链接这些库,并试图切换到静态链接,但遇到了“ undefined reference ”错误。
其中一个错误涉及名为 Effect 的类,该类位于名为 shading 的库中。库排版有一个名为 Type_Effect 的类,它派生自 Effect。处理排版时,链接器找不到 Effect 类的任何符号。
我验证了这些库是这样包含的:
.../shading/libshading.a .../typography/libtypography.a ...
我使用 -verbose 命令运行了链接器,着色的部分输出是:
attempt to open .../shading/libshading.a succeeded
(.../shading/libshading.a)Shader_Manager.cpp.obj
(.../shading/libshading.a)Shader.cpp.obj
(.../shading/libshading.a)Program.cpp.obj
Effect.cpp.obj 丢失。我检查了 shading.a 文件,它确实包含 Effect.cpp 和所有相关的 Effect 符号。接下来,我将用于创建 Effect 对象的虚拟代码添加到我的主要可执行 cpp 文件中,并且现在确实包含了链接器输出:
([...]/shading/libshading.a)Effect.cpp.obj
或者,在 linklibs.rsp 之前加上 --whole-archive
会强制链接器加载 Effect.cpp.obj,但加载所有内容会引入超出此问题范围的其他问题。
证据表明链接器在确定要包含哪些目标文件时发生了一些故障。着色库未直接用于我的主要可执行目标,因此加载的某些着色器对象的存在表明至少某些依赖项跟踪正在运行。
在 --whole-archive
的 ld 标志文档中,它提到了该标志如何
include[s] every object file in the archive in the link, rather than searching the archive for the required object files.
搜索背后的一些逻辑是什么?哪些因素可以成就或破坏它?