从另一个Windows Phone运行时组件项目引用C ++类

时间:2014-12-17 09:36:16

标签: c++ silverlight windows-runtime windows-phone-8.1

我有两个Windows Phone运行时组件项目(Windows Phone Silverlight 8.1),其中包含C ++类:

  • 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();
}

如果我尝试将Foo链接到Bar"传统上"通过将FooRuntimeComponent.lib指定为附加依赖项并提供.lib的路径,然后我得到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'

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

在解决方案资源管理器中,右键单击BarRuntimeComponent (Windows Phone Silverlight 8.1)项目项目(不是解决方案)并选择Add> References...。单击Add New Reference...按钮,然后找到FooRuntimeComponent项目(如果foo项目与bar项目位于同一解决方案中,那么您将在Solution项目下找到foo项目窗口的左边)。确保选中foo项目,然后单击OK,然后再次单击OK。您现在应该可以在条形项目中使用FooClass。这就是它的全部内容。

您可能首先需要撤消之前可能已执行的任何其他引用(例如您手动链接的.lib文件)。同时从BarClass.cpp文件中删除#include "FooClass.h"行。编译器从.winmd文件中获取类型。