2011-01-25 97 views
2

我正在链接ntdll.lib以使用ZwQueryInformationProcess,并使用多线程运行时库。错误LNK2005:已在ntdll.lib(ntdll.dll)中定义_sprintf

ntdll似乎定义了一些crt函数。所以,当我连接它并使用运行时库时,我得到链接器错误。

我可以强制链接器使用crt函数并忽略ntdll符号以摆脱错误吗?或者以别的方式解决这个错误。

我知道ZwQueryInformationProcess的文档建议动态加载,但它在静态库中使用我的主项目也链接到,并且这一直工作很长时间,所以我不想改变它。

谢谢。

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

+0

你从哪里得到ntdll.lib? ntdll.dll会导出sprintf,但不包含前导下划线。这不应该导致_sprintf的链接器错误。 – 2011-01-25 15:08:23

+0

我连接到C:\ WINDDK \ 7600.16385.0 \ lib \ wxp \ i386 \ ntdll.lib,我意识到在该DDK中有更高版本的lib,但我的程序需要在xp上运行。我检查过,这个有_sprintf,但是我见过的其他ntdll.lib不会导出它。 – 2011-01-25 15:26:48

回答

2

更改链接顺序似乎解决了它。要更改自动链接库的顺序,您需要通过添加到“忽略特定库”来忽略它们,然后按照您希望它们链接的顺序将它们重新添加到“附加相关性”中。该错误信息是这样的:

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

所以,我说LIBCMT.LIB如忽略了,也把它的附加依赖的开始。这产生了另一个错误,我遵循相同的步骤。因此,项目属性最终看上去像这样(ntdll.lib是在附加依赖结束):

Project properties screenshot

我还发现添加功能/ verbose:lib添加到链接器 - >命令行 - >其他选项是有用的,以便您可以确切地看到哪些库链接和以什么顺序。

相关问题