ld 没有加载所需的目标文件

ld not loading required object files

我有一个 C++ 项目,分为多个库目标和一个可执行目标。我一直在动态链接这些库,并试图切换到静态链接,但 运行 进入 "undefined reference" 错误。

其中一个错误涉及名为 Effect 的 class,它位于名为 shading 的库中。库排版有一个名为 Type_Effect 的 class,它源自 Effect。处理排版时,链接器找不到效果 class.

的任何符号

我确认库是这样包含的:

.../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 对象的虚拟代码添加到我的主要可执行 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.

该搜索背后的一些逻辑是什么?哪些因素可以成就或破坏它?

我缺少的逻辑是,当静态链接时,ld 仅在目标文件包含 ld 已经从先前加载的目标文件中知道的未解析符号的定义时从存档中加载目标文件。

Why does the order in which libraries are linked sometimes cause errors in GCC?

因此,ld 输入需要从依赖项到依赖项排序。排版库需要在着色库之前列出。我弄反了。