繁体   English   中英

使用Visual Studio 2008从x86编译x64 dll:无法解析的外部__imp_符号

[英]Compiling x64 dll from x86 using Visual Studio 2008: unresolved external __imp_ symbols

我已经使用Visual Studio 2008将一些外部C ++代码编译为dll,thirdpartycode.dll。代码被包装在extern“ C”中。

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

我的thirdpartycode.dll编译并成功链接。 接下来,我要创建另一个包含调用第三方代码.dll的代码的dll:wrapper.dll。 顾名思义,它是一个包装程序,可简化对thirdpartycode.dll中复杂API的某些调用。 然后,我计划从C#程序调用wrapper.dll。

但是我的问题是,当我尝试链接wrapper.dll时,得到了未解析的符号:-(。对于thirdpartycode.dll中的每个函数,例如“ func1”;我得到了未解析的外部符号“ __imp_func1”。验证第三方代码是否确实导出了“ func1”。

我确实在“其他依赖项”中列出了thirdpartycode.lib。 我已打开/ VERBOSE,可以看到正在搜索thirdpartycode.lib。

如果我重复整个过程,但是使用x86作为“活动解决方案平台”,那么一切正常!

任何想法出了什么问题?

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

预先感谢您的任何回答!

只是为了验证,当您将thirdpartycode.lib添加到“其他依赖项”时,您确定要正确包含libs位置的路径吗? 在链接程序->常规的“其他库目录”部分下。

另外,如果项目在同一个解决方案中,您是否要确保构建顺序确保在代码之前先构建第三方代码项目?

我在通过存根库链接到64位dll时遇到类似的问题。 对于我的32位应用程序,它似乎链接到一个32位dll,该declspec(dllimport)将imp附加到查找的函数名称上,但仅对64位dll附加_ imp

例如,对于我的32位版本的dll,“ function1()”将变为“ _ imp _function1”,但是当我将DLL的64位版本链接到我的64位应用程序时,我得到了错误:

未解析的外部符号__imp_function ...

请注意,附加到__imp的单个下划线与32位版本的双下划线相同。 当我无法以32位链接所需的库时,出现链接错误:

未解析的外部符号_ imp _function ...

我可以通过将_附加到标头中的函数名称上(即_function()而不是function())来解决此问题。这很麻烦,但是它表明对于64位declspec(dllimport,实际上修饰是不同的)与32位declspec(dllimport)进行比较。

我正在使用Visual Studio 2010并链接到使用gcc创建的dll。 我在某处读到Visual Studio创建的64位dll用单个下划线_ imp装饰,因此问题可能是gcc前后始终使用双下划线,但是VS希望32位dll的装饰不同于64-位dll。

我尚未在Microsoft MSDN上找到与此不同的描述。 任何人都可以确认declspec(dllimport)在Visual Studio中修饰函数名称的方式有64位和32位的区别吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM