我有两个包含C ++类的Windows Phone运行时组件项目(Windows Phone Silverlight 8.1):
FooRuntimeComponent:
FooClass.cpp
FooClass.h
BarRuntimeComponent:
BarClass.cpp
BarClass.h
我想在Bar类中创建的Foo对象上调用方法。
Foo.h:
#pragma once
namespace FooRuntimeComponent
{
public ref class FooClass sealed
{
public:
FooClass();
};
}
FooClass.cpp:
#include "FooClass.h"
using namespace FooRuntimeComponent;
using namespace Platform;
FooClass::FooClass()
{
}
BarClass.cpp:
#include "BarClass.h"
#include "FooClass.h"
using namespace BarRuntimeComponent;
using namespace Platform;
using namespace FooRuntimeComponent;
BarClass::BarClass()
{
FooClass^ foo = ref new FooClass();
}
如果我尝试通过将FooRuntimeComponent.lib指定为附加依赖项并提供指向.lib的路径来“传统上”将Foo链接到Bar,那么我将收到Bar的以下编译错误:
error LNK2019: unresolved external symbol "public: __cdecl FooRuntimeComponent::FooClass::FooClass(void)" (??0FooClass@FooRuntimeComponent@@Q$AAA@XZ) referenced in function "public: __cdecl BarRuntimeComponent::BarClass::BarClass(void)" (??0BarClass@BarRuntimeComponent@@Q$AAA@XZ)
在FooRuntimeComponent.lib上运行dumpbin.exe会产生:
Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file FooRuntimeComponent.lib
File Type: LIBRARY
Summary
FF .debug$S
14 .idata$2
14 .idata$3
4 .idata$4
4 .idata$5
20 .idata$6
我确实注意到运行时组件会生成一个.winmd文件。我尝试添加此.winmd作为对Bar项目的引用,但是随后出现以下错误:
error C2011: 'FooRuntimeComponent::FooClass' : 'class' type redefinition
error C2027: use of undefined type 'FooRuntimeComponent::FooClass'
error C2027: use of undefined type 'FooRuntimeComponent::FooClass'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2680: 'FooRuntimeComponent::FooClass ^' : invalid target type for dynamic_cast
error C2440: 'return' : cannot convert from 'FooRuntimeComponent::FooClass ^' to 'int'
我想念什么吗?
最佳答案
在解决方案资源管理器中,右键单击您的BarRuntimeComponent (Windows Phone Silverlight 8.1)
项目项(不是解决方案),然后选择Add
> References...
。单击Add New Reference...
按钮,然后找到FooRuntimeComponent
项目(如果foo项目与bar项目位于相同的解决方案中,那么您将在窗口左侧的Solution
项目下找到foo项目) 。确保选中了foo项目,然后单击“确定”,然后再次单击“确定”。现在,您应该可以在Bar项目中使用FooClass
了。这就是全部。
您可能首先需要撤消以前可能做过的任何其他引用(例如手动链接的.lib文件)。还要从BarClass.cpp文件中删除#include "FooClass.h"
行。编译器从.winmd文件获取类型。