假设一个静态库libfoo依赖于另一个静态库libbar来获得某些功能。这些和我的应用程序都用D编写。如果我的应用程序只直接使用libfoo,并且只调用libfoo中不引用libbar符号的函数,有时程序链接成功而不将libbar传递给链接器,有时则不会。
其中发生的事情似乎取决于我用来编译libfoo,libbar和我的应用程序的编译器,即使所有编译器都使用GCC工具链进行链接。如果我正在使用DMD,如果我没有将libbar传递给链接器,我永远不会收到链接器错误。如果我正在使用GDC,我有时会这样做,原因我不明白。如果我正在使用LDC,我总是这样做。
当libfoo中引用的符号未定义时,是什么判断GCC链接器是否失败,但此符号出现在应用程序对象文件未引用的函数中?
答案 0 :(得分:1)
当libfoo中引用的符号未定义时,是什么判断GCC链接器是否失败,但此符号出现在应用程序对象文件未引用的函数中?
如果链接器抱怨未解析的符号,那么就是从某处引用符号 。
通常,链接器会告诉您未解析的引用来自哪个对象,但如果不是,则-Wl,-y,unres_symbol
应该。
您可能还想阅读description整个过程的工作原理。
答案 1 :(得分:1)
如果链接器没有努力消除库中的死(未使用)代码,它只是假设使用了所有引用的符号 并尝试将它们链接在
中如果它消除了(例如通过一个简单的标记和扫描算法(注意你不能完全决定某些代码是否未被使用,因为该问题可以减少到暂停问题))它可以如果从未使用过,则删除未使用的库
此行为是实现定义的(并且可能存在可以设置为/禁用它的链接器标志