2010-07-22 129 views
0

我使用Visual Studio 2008将一些外部C++代码编译到dll,thirdpartycode.dll中。代码被封装在extern“C”中。使用Visual Studio 2008从x86编译x64 dll:无法解析的外部__imp_符号

由于我正在交叉编译,在我的32位机器上创建一个64位的DLL;我在“配置管理器”中将x64用作“主动解决方案平台”。

我的thirdpartycode.dll编译并链接成功。 接下来,我想创建另一个dll,其中包含调用thirdpartycode.dll的代码: wrapper.dll。 正如名称所示,它是一个简化对thirdpartycode.dll中复杂API的某些调用的包装。 然后我打算从C#程序调用wrapper.dll。我的问题是当我尝试链接我的wrapper.dll时,我得到未解决的符号:-(。 对于thirdpartycode.dll中的每个函数,例如“func1”;我得到一个无法解析的外部符号“__imp_func1” 。使用的Dependency Walker我确认thirdpartycode.dll indeeed不出口“FUNC1”。

我待办事项thirdpartycode.lib中的“其他的依赖”。我已经打开/冗长,可以看到thirdpartycode.lib搜索。

如果我重复这整个过程,但使用x86作为“主动解决方案平台”的东西很好用!?

任何想法出了什么问题?

__imp_前缀来自哪里? 这有点令人困惑,因为对于故障排除,我会使用Dependency Walker将来自thirdpartycode.dll的导出符号与使用dumpbin的wrapper.obj中的所需符号进行比较。

在此先感谢您的任何答案!

+0

什么是未解决的符号名称?他们是系统功能还是来自第三方代码(即外部库)? – rubenvb 2010-07-22 08:38:42

+0

他们来自第三方代码。 – 2010-07-22 08:59:23

+0

对不起,我忘记提及第三方代码使用Windows系统库。 当我在Dependency Walker(depends.exe)中打开它时,我发现一些奇怪的东西:我的dll被标记为64位。然而,我的DLL依赖于C:\ windows \ system32 \ ntdll.dll和C:\ windows \ system32 \ kernel32.dll这是32位!因此,Dependency Walker给我提供了以下错误:“错误:由于隐式依赖模块中缺少导出函数,导致至少有一个模块导入了未解析的错误。错误:找到了具有不同CPU类型的模块。 – 2010-07-23 11:32:28

回答

0

只是为了验证,当您将thirdpartycode.lib添加到“其他依赖项”时,您确保将正确的libs位置路径包含在内?在Linker-> General的“附加库目录”部分下。

此外,如果项目采用相同的解决方案,您是否确保构建顺序是第三方代码项目在编码之前构建的?

+0

是的,是的。也从使用/ VERBOSE的链接器的输出中,我可以看到第三方代码.lib被搜索。 – 2010-07-23 11:30:16

+0

感谢您的建议JMcCarty,但我认为必须有其他事情出错。 – 2010-07-23 11:34:04

0

我遇到了一个类似的问题,通过一个存根库链接到一个64位的dll。它出现在我的32位应用程序链接到一个32位dll declspec(dllimport)追加imp到它查找的函数名称,但只为64位DLL追加_ imp。例如,“function1()”会变成“_ imp _function1”,并且可以找到我的32位版本的dll,但是当我将64位版本的dll链接到我的64位版本的dll中时,位应用程序,我得到的错误:

解析外部符号__imp_function ...

注单下划线追加到__imp而同期32位版本的双下划线。当我无法链接32位所需的库时,出现链接错误:

无法解析的外部符号_ imp _function ...

我可以通过在我的头文件中添加_到函数名称(即_function()而不是函数()来解决这个问题。这是一个kludge,但它表明的确, bit declspec(dllimport)与32位declspec(dllimport)进行比较。

我正在使用Visual Studio 2010并链接到使用gcc创建的dll。单一的underbar,_ imp,所以也许问题是gcc一贯地在前后使用双重下划线,但VS期望32位dll被装饰与64位dll不同。我还没有设法在微软MSDN上找到这个不同的描述。任何人都可以确认在Visual Studio中declspec(dllimport)如何装饰函数名有64位和32位的区别?

相关问题