编译链接x86静态库的x64动态库时LNK2001和LNK1120

时间:2013-07-22 11:36:11

标签: c++ visual-studio-2010 dll static-libraries lnk2001

我最近被分配到一个c ++项目,虽然我不是一个c ++开发人员。我被提供为Visual Studio 2010 Professional作为IDE。所以我试了一下。

我要写一个c ++动态库(* .dll),它包装了两个静态库(* .lib)。静态库是我们几年前从另一家公司购买的第三方库。使用dumpbin /header ... cmd调用,我可以说两个静态库都具有以下文件头值:

14C machine (x86)

我将此任务用于Win32解决方案平台。我将头文件和库添加到项目中。通过在.cpp中编写两个#pragma comment(lib, ...)语句来包含库我需要函数。工作就像一个魅力。示例函数如下所示:

extern "C" void OURFreeStringBuf(Cm_StringBuf *sbuf)
{
    FreeStringBuf(sbuf); // the call to the static library
}

此动态库也将用于x64体系结构中。所以我尝试将解决方案平台设置为x64。现在,每次调用一个静态库函数时都会出现以下错误(没有进行代码更改或进行其他配置更改):

error LNK2001: unresolved external symbol "..."

后跟一个总结错误:

error LNK1120: 29 unresolved external links

这些错误可能是尝试在x64 dll中链接x86 lib文件的结果吗?有没有机会使用提供的静态库完成此任务?

非常感谢你。

1 个答案:

答案 0 :(得分:6)

你不能 - 换句话说,没有办法 - 将32位库与64位可执行文件或DLL(或32位可执行文件链接到64位DLL,反之亦然)链接。您将要么将.DLL / .EXE编译为32位,要么找到64位版本的32位库。没有其他解决方案!

64位架构在几个方面与32位架构不同,但最重要的是,64位架构中的地址(指针)是64位,这可以防止几乎任何32位代码工作正确地在64位环境中(因为地址的高32位丢失,这不会产生任何有意义的东西)。