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

时间:2016-09-01 22:27:21

标签: c++ ld

我有一个C ++项目,分为多个库目标和一个可执行目标。我一直在动态链接这些库,我正试图切换到静态链接,但遇到了未定义的引用"错误。

其中一个错误涉及名为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符号。接下来,我添加了用于在我的主可执行文件cpp文件中创建Effect对象的虚拟代码,现在确实包含了链接器输出:

([...]/shading/libshading.a)Effect.cpp.obj

或者,在linklibs.rsp之前加上--whole-archive会强制链接器加载Effect.cpp.obj,但加载所有内容会引入超出此问题范围的其他问题。

证据表明链接器中的某些故障确定了要包含的目标文件。着色库不直接在我的主可执行目标中使用,因此加载某些着色器对象的存在表明至少有一些依赖性跟踪正在工作。

--whole-archive的ld标志文档中,它提到了该标志

的方式
  

在链接中包含[s]归档中的每个目标文件,而不是   在存档中搜索所需的目标文件

搜索背后的逻辑是什么?哪些因素可以决定成败?

1 个答案:

答案 0 :(得分:1)

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

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

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