【问题标题】:Why would a linker try to link to a file I never told it to link to?为什么链接器会尝试链接到我从未告诉它链接的文件?
【发布时间】:2016-07-04 08:13:46
【问题描述】:

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

我告诉链接器链接到几个静态库。我链接的许多库都是 wxWidgets 静态库。我不需要来自 wxWidgets 的所有模块,所以有一些我正在链接,而很多我没有。链接器无法打开的文件是“wxbase31ud_net.lib”。就像我说的那样,该文件不在我要链接的库中。我的直接想法是,这种依赖关系是以某种方式隐式引入的,可能是由我链接到的 wxwidgets 库之一。我不认为静态链接以这种方式工作,但我没有任何其他想法。我一直在调查这种可能性,但没有发现任何迹象表明情况确实如此。

  • 我将构建输出详细程度设置为最大,并且在报告错误之前从未在任何地方提及“wxbase31ud_net.lib”。
  • 我在我的 cmake 项目中确认,相关文件从未从 FindWxWidgets 模块传回给我,也从未在我与目标关联的任何文件列表中引用。
  • 我用 grep 搜索了整个项目目录,并没有发现任何地方对该文件的引用,包括 cmake 生成的项目文件(Visual Studio 项目文件)。

什么可能导致链接器尝试打开此文件?

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

【问题讨论】:

    标签: visual-c++ linker static-libraries wxwidgets static-linking


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我确实通过链接到整个目录来解决这个问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多