为什么 link 人会尝试 link 到一个我从未告诉过它 link 的文件?

Why would a linker try to link to a file I never told it to link to?

我收到一个 linker 错误,表明 linker 无法打开文件(静态库),因此它失败了。我很难解决这个错误,因为我从来没有告诉 linker 到 link 它无法打开的文件。

我告诉 linker link 几个静态库。我 link 正在使用的许多库都是 wxWidgets 静态库。我不需要 wxWidgets 中的所有模块,所以有些模块我 link 正在使用,而许多我不需要。 linker 打不开的文件是'wxbase31ud_net.lib'。正如我所说,该文件不在我 link 访问的库中。我的直接想法是,这种依赖性正在以某种方式隐式引入,也许是由我 link 访问的 wxwidgets 库之一引入的。我不认为 static linkage 是这样工作的,但我没有任何其他想法。我一直在调查这种可能性,但没有发现任何迹象表明是这种情况。

是什么原因导致 link 用户尝试打开此文件?

编辑:另外,需要说明的是,我看到的错误是 LNK1104

它可能来自 #pragma comment(lib,"???") 除了在 wx 的情况下,pragma 的参数可能是复杂的宏并且很难 grep。这个特别的可能来自 setup.h 和 #pragma comment(lib, wxWX_LIB_NAME("base", ""))。您应该通过将带有 wx 库的目录添加到链接器的搜索目录来解决这个问题。

zeromus 的回答是正确的,这几乎可以肯定是因为包含 msvc/wx/setup.h,其中包含 #pragma comment(lib)。可能的解决方案:

  1. 最简单:构建所有库,这将解决错误,并且 link 使用您不使用的库不是问题。
  2. 也很简单但不太明显:在构建项目时预定义wxNO_NET_LIB,这将防止上面的文件自动linking 这个特定的库。当然,如果您缺少其他库,您 may/will 需要定义更多 wxNO_XXX_LIB 符号。
  3. 不那么简单,但也可以说是最不神奇的:停止在你的包含路径中使用 $(WXWIN)/include/msvc,然后它下面的 wx/setup.h 将不会被包含,也不会 linked自动地。缺点是您必须手动指定 link 所需的所有库。