为什么 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 是这样工作的,但我没有任何其他想法。我一直在调查这种可能性,但没有发现任何迹象表明是这种情况。
- 我将构建输出的详细程度设置为最大,并且在报告错误之前从未在任何地方提及 'wxbase31ud_net.lib'。
- 我在我的 cmake 项目中确认,有问题的文件从未从 FindWxWidgets 模块传回给我,也从未在我与目标关联的任何文件列表中引用。
- 我 grep 了整个项目目录,没有发现任何地方对该文件的引用,包括 cmake 生成的项目文件(visual studio 项目文件)。
是什么原因导致 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)
。可能的解决方案:
- 最简单:构建所有库,这将解决错误,并且 link 使用您不使用的库不是问题。
- 也很简单但不太明显:在构建项目时预定义
wxNO_NET_LIB
,这将防止上面的文件自动linking 这个特定的库。当然,如果您缺少其他库,您 may/will 需要定义更多 wxNO_XXX_LIB
符号。
- 不那么简单,但也可以说是最不神奇的:停止在你的包含路径中使用
$(WXWIN)/include/msvc
,然后它下面的 wx/setup.h
将不会被包含,也不会 linked自动地。缺点是您必须手动指定 link 所需的所有库。
我收到一个 linker 错误,表明 linker 无法打开文件(静态库),因此它失败了。我很难解决这个错误,因为我从来没有告诉 linker 到 link 它无法打开的文件。
我告诉 linker link 几个静态库。我 link 正在使用的许多库都是 wxWidgets 静态库。我不需要 wxWidgets 中的所有模块,所以有些模块我 link 正在使用,而许多我不需要。 linker 打不开的文件是'wxbase31ud_net.lib'。正如我所说,该文件不在我 link 访问的库中。我的直接想法是,这种依赖性正在以某种方式隐式引入,也许是由我 link 访问的 wxwidgets 库之一引入的。我不认为 static linkage 是这样工作的,但我没有任何其他想法。我一直在调查这种可能性,但没有发现任何迹象表明是这种情况。
- 我将构建输出的详细程度设置为最大,并且在报告错误之前从未在任何地方提及 'wxbase31ud_net.lib'。
- 我在我的 cmake 项目中确认,有问题的文件从未从 FindWxWidgets 模块传回给我,也从未在我与目标关联的任何文件列表中引用。
- 我 grep 了整个项目目录,没有发现任何地方对该文件的引用,包括 cmake 生成的项目文件(visual studio 项目文件)。
是什么原因导致 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)
。可能的解决方案:
- 最简单:构建所有库,这将解决错误,并且 link 使用您不使用的库不是问题。
- 也很简单但不太明显:在构建项目时预定义
wxNO_NET_LIB
,这将防止上面的文件自动linking 这个特定的库。当然,如果您缺少其他库,您 may/will 需要定义更多wxNO_XXX_LIB
符号。 - 不那么简单,但也可以说是最不神奇的:停止在你的包含路径中使用
$(WXWIN)/include/msvc
,然后它下面的wx/setup.h
将不会被包含,也不会 linked自动地。缺点是您必须手动指定 link 所需的所有库。