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

标签 c++ ld

<分区>

我有一个 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.

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

最佳答案

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

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

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

关于c++ - ld 没有加载所需的目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281797/

相关文章:

C++使用wstring拆分unicode分隔的字符串

c# - 如何查看 c++ 和 c# dll 依赖项?

linux - ld 在错误的路径中搜索,并搜索错误的库

ios - 为什么 Xcode 5 告诉我在为模拟器 (i386) 构建时我有重复的 C 库函数符号?

linux - GNU/Debian Linux 和 LD

c - libc_nonshared.a(stat.oS) 中的隐藏符号 `stat' 被 DSO 引用

c++ - Qt : catched mouseMoseEvent dont interact with QWebView html page element

c++ - 这是 MSVC++ 2017 更新 3 中的编译器错误吗

c++ - 如何防止 clang-format 在流运算符调用之间添加换行符 <<

gcc - 使用弱符号时如何避免对 GLIBC_X.Y 的依赖