C++ 基于COM的库的带有WinRT组件的未解析外部符号LNK2019
我在本机WinRT组件中使用了一个名为Engine的基于第三方COM的库,该库稍后将用作第三方库的包装器。 第三方库的Engine.lib和Engine.h文件在我的项目中设置 我正在为我的以下cpp文件获取LNK2019:C++ 基于COM的库的带有WinRT组件的未解析外部符号LNK2019,c++,linker,windows-runtime,wrl,C++,Linker,Windows Runtime,Wrl,我在本机WinRT组件中使用了一个名为Engine的基于第三方COM的库,该库稍后将用作第三方库的包装器。 第三方库的Engine.lib和Engine.h文件在我的项目中设置 我正在为我的以下cpp文件获取LNK2019: #include "pch.h" #include "Engine.h" void Component::Init() { ComPtr<IEngine> spEngine; Settings settings; CreateEngine(&setti
#include "pch.h"
#include "Engine.h"
void Component::Init()
{
ComPtr<IEngine> spEngine;
Settings settings;
CreateEngine(&settings, &spEngine);
}
Engine.h对CreateEngine的定义如下:
STDAPI CreateEngine(
_In_ Settings * pSettings,
_Outptr_ IEngine **ppEngine );
其中STDAPI是常用的宏:
#define STDAPI extern "C" HRESULT __stdcall
有什么想法吗?在Inspired的帮助下找到了答案:我使用的是为ARM构建的库,配置为x86构建。改变后,一切都很好 Engine.lib是否存在于链接器的命令行中?(VS2012允许查看链接器的命令行参数)dumpbin是否显示
CreateEngine@8
(带有尾随的@8
)?不,dumpbin只显示CreateEngine。是的,链接器命令行显示Engine.lib作为OUT参数的一部分。Engine.lib中定义的其他类型,如IEngine或Settings,编译和链接都很好。后面的“@”是什么意思?(我已经有一段时间没有进行本机编码了;)您是否认为.lib和.h文件不匹配,因为DUMPBIN/EXPORTS将CreateEngine显示为export?尾部的@8
来自stdcall
约定,8
意味着函数返回后必须从堆栈中弹出8个字节。这是大多数C编译器的stdcall
的默认名称修饰。但是.lib文件不包含@8
,这会产生错误。也许您应该在某个地方指定WinRT项目类型(它会禁用装饰吗?),或者.lib文件是用不同的编译器编译的。非常感谢。我认为WinRT项目类型应该是正确的。我使用Windows Phone。我将联系该第三方库的供应商,并要求更好的构建。
#define STDAPI extern "C" HRESULT __stdcall