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

时间:2010-07-22 08:13:39

标签: c++ c visual-studio visual-studio-2008

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

因为我正在交叉编译,所以在我的32位机器上创建一个64位的dll;我在“配置管理器”中使用x64作为“活动解决方案平台”。

我的thirdpartycode.dll编译并成功链接。 接下来我想创建另一个包含调用thirdpartycode.dll的代码的DLL: wrapper.dll。 正如名称所示,它是一个包装器,简化了对thirdpartycode.dll内部复杂API的某些调用。 然后我计划从C#程序调用wrapper.dll。

我的问题是,当我尝试链接我的wrapper.dll时,我得到了未解析的符号:-(。 对于thirdpartycode.dll中的每个函数,例如“FUNC1”;我得到一个未解析的外部符号“__imp_func1”。使用Dependency Walker我验证thirdpartycode.dll indeeed是否导出“func1”。

我在“附加依赖项”中列出了thirdpartycode.lib。我打开了/ VERBOSE,可以看到搜索到了thirdpartycode.lib。

如果我重复整个过程,但使用x86作为“Active solution platform”,那么一切正常!?

任何想法出了什么问题?

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

提前感谢您的任何答案!

2 个答案:

答案 0 :(得分:0)

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

此外,如果项目在同一个解决方案中,您是否确保构建订单是在代码之前构建第三个代码项目的?

答案 1 :(得分:0)

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

例如,“function1()”将成为“_ imp _function1”并且找到我的32位版本的dll,但是当我链接64位版本的dll时进入我的64位应用程序,我得到错误:

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

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

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

我可以通过在我的标题中添加_来解决问题(即._function()而不是function()。这是一个kludge,但它表明64位的装饰确实不同declspec(dllimport)与32位declspec(dllimport)相比。

我正在使用Visual Studio 2010并链接到使用gcc创建的dll。我在某处读到Visual Studio创建的64位dll用单个下划线_ imp 进行装饰,所以问题可能是gcc在前后一直使用双下划线,但是VS期望32位dll装饰与64位dll不同。

我还没有在微软MSDN上找到这种不同的描述。任何人都可以确认declspec(dllimport)在Visual Studio中如何修饰函数名称有64位与32位的区别?