错误LNK2005:_sprintf已在ntdll.lib中定义(ntdll.dll)

时间:2011-01-25 14:46:59

标签: c++ windows

我正在与ntdll.lib链接以使用ZwQueryInformationProcess并使用多线程运行时库。

ntdll似乎定义了一些crt函数。因此,当我链接它并使用运行时库时,我会收到链接器错误。

我可以强制链接器使用crt函数并忽略ntdll符号来消除错误吗?或者其他方式解决这个错误。

我知道ZwQueryInformationProcess的文档建议动态加载,但它在我的主项目也链接到的静态库中使用,并且这已经很好地工作了很长时间,所以我宁愿不改变它。 / p>

感谢。

我在其他网站上发现了一些关于此问题的讨论,例如:http://www.codeguru.com/forum/archive/index.php/t-414274.html但是没有看到任何似乎提供良好解决方案的内容。有一些提到更改链接顺序,但我看不到如何通过项目设置更改运行时库链接的顺序。

1 个答案:

答案 0 :(得分:3)

更改链接顺序似乎可以解决它。要更改自动链接库的顺序,您需要通过添加“忽略特定库”忽略它们,然后按照您希望它们链接的顺序将它们重新添加到“附加依赖项”。错误消息是:

1>libcmt.lib(wcstol.obj) : error LNK2005: _wcstoul already defined in ntdll.lib(ntdll.dll)

因此,我将libcmt.lib添加为忽略,并将其放在其他依赖项的开头。这产生了另一个错误,我跟着相同的步骤。因此,项目属性最终看起来像这样(ntdll.lib位于附加依赖项的末尾):

Project properties screenshot

我还发现在链接器中添加/ verbose:lib - >命令行 - >其他选项非常有用,以便您可以确切地查看链接的库以及链接的顺序。