【发布时间】:2011-03-19 10:15:25
【问题描述】:
我已经使用 Visual Studio 2008 将一些外部 C++ 代码编译成一个 dll,thirdpartycode.dll。该代码被包裹在 extern "C" 中。
由于我是交叉编译,所以在我的 32 位机器上创建一个 64 位 dll;我在“配置管理器”中使用 x64 作为“活动解决方案平台”。
我的thirdpartycode.dll 编译和链接成功。 接下来我要创建另一个包含调用thirdpartycode.dll 的代码的dll: 包装器.dll。 顾名思义,它是一个包装器,用于简化对thirdpartycode.dll 中复杂API 的某些调用。 然后我打算从 C# 程序中调用 wrapper.dll。
然而,我的问题是,当我尝试链接我的 wrapper.dll 时,我得到未解析的符号 :-(。 对于 thirdpartycode.dll 中的每个函数,例如“功能1”;我得到一个未解析的外部符号“__imp_func1”。使用 Dependency Walker 我验证了thirdpartycode.dll 确实导出了“func1”。
我确实在“附加依赖项”中列出了thirdpartycode.lib。我已打开 /VERBOSE 并且可以看到已搜索到 thirdpartycode.lib。
如果我重复整个过程,但使用 x86 作为“主动解决方案平台”,一切都会正常!?
有什么想法吗?
__imp_ 前缀从何而来? 这有点令人困惑,因为为了进行故障排除,我会将使用 Dependency Walker 从thirdpartycode.dll 导出的符号与使用dumpbin 从wrapper.obj 导出的符号进行比较。
提前感谢您的任何回答!
【问题讨论】:
-
什么是未解析的符号名称?它们是系统函数还是来自第 3 方代码(即外部库)?
-
它们来自第三方代码。
-
对不起,我忘了提到第 3 方代码使用 Windows 系统库。当我在 Dependency Walker (depends.exe) 中打开它时,我注意到一些奇怪的事情:我的 dll 被标记为 64 位。但是,我的 dll 取决于 32 位的 C:\windows\system32\ntdll.dll 和 C:\windows\system32\kernel32.dll !结果,Dependency Walker 给了我以下错误:“错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。错误:找到了具有不同 CPU 类型的模块。”
标签: c++ c visual-studio visual-studio-2008