【问题标题】:dll linking static library - unresolved linker symbols from unused functionsdll 链接静态库 - 未使用函数中未解析的链接器符号
【发布时间】:2020-01-14 09:16:07
【问题描述】:

我有一个静态库staticLibA.lib,它提供了许多功能。其中一些需要此库中未提供的一些外部函数。

另外,我定义了一个动态库dynLib.dll,它使用了一些静态库函数,但没有一个函数需要上述外部函数。

但如果我链接动态库,我会得到未解析的外部符号,尽管它们不应该是必需的。

编译器不应该只从静态库中选择目标确实需要的函数吗?

这里有一个小例子

staticLib.lib:

// staticLib_fileA.c

extern void extLibFunction();
void slib_funcA(){
  extLibFunction();
  // some stuff
}

// staticLib_fileB.c

void slib_funcB(){
  // some stuff
}

dynLib.dll

// dynLib.c

void dyn_func(){
  slib_funcB();
  // some stuff
}

dynLib.dll的编译/链接带来了未解符号extLibFunction

staticLib.lib(staticLib_fileA.obj) : error LNK2001: unresolved external symbol extLibFunction

有没有办法解决这个问题?一些编译器设置告诉只链接实际需要的符号。 一种解决方法是一些虚拟实现,但我更喜欢某种方式,只在需要这些部分时才强制 lib 的用户做某事

【问题讨论】:

  • 请向我们展示编译和链接所有工件的命令。 (对不起,过早的回答,我被这两个函数的单个代码块误导了。)
  • @thebusybee 我只是想为您的答案添加一些额外的评论。也许现在还为时过早。代码非常大,staticLib 中的源文件之间的某些依赖关系可能会导致其他目标文件的链接。像 fileB 中的其他函数一样,使用 fileC 中的函数,其中包含使用 fileA 中其他函数的函数。我仍然强烈希望在函数级别上,dynLib 中使用的函数不会直接依赖于调用 extLib-Functions 的函数。
  • 您可以向链接器索取交叉引用,这可能有助于解决这个问题。
  • @thebusybee 你能给我一些关于这个的链接吗?仅找到 .net 引用
  • 我不使用 Visual C... 微软的工具似乎无法做到这一点(再次失败。)快速搜索显示this page of options。在 GCC 上,-Wl,--cref 将选项 -c-ref 提供给链接器。是时候更换编译器了?

标签: c++ c visual-studio visual-c++ linker


【解决方案1】:

与静态库不同,DLL 不能有未解析的符号(引用)。 DLL 允许二进制文件在运行时访问所有符号,甚至其中一些是不需要的。 库由 .o 文件组成。库中的某些 .o 文件可能包含程序中未使用的符号。 在链接时,您的静态库可以包含未解析的符号,只要您不需要这些未解析的符号或 .o 文件中包含未解析符号的任何其他符号。使用 DLL,情况就不一样了,您必须在链接时解析所有引用,即使您的程序不需要它们。

【讨论】:

  • 这也不正确,因为 dll 允许在运行时显式访问导出的符号。
【解决方案2】:

由于fileB.obj 中的其他函数导致fileA.obj 的依赖关系,因此整个目标文件似乎相互依赖。

因此,外部依赖项也必须被填充,即使使用此依赖项的函数永远不会在链接的二进制文件中被调用(或者在 dll 的情况下:被导出),甚至在@987654324 中也不会被调用@。

如果启用了“功能级链接”和“Comdat 折叠”,这似乎是正确的。

Raymond Chen 在围绕链接原理的一系列博客文章中解释了为什么这是真的:

https://devblogs.microsoft.com/oldnewthing/tag/linker

事实证明,即使使用先进的技术(如上面提到的),第一步也是必须解决所有符号的经典方法,即使之后的优化会再次去除这些符号。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2017-04-13
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多