0

我正在使用旧版本的 C++ SMILE 库进行贝叶斯分析,该库在开始销售之前免费提供。我不知道使用什么编译器来创建库,但我只有头文件和 lib 文件。我正在尝试使用托管 C++ 代码包装这些库,以便在使用 Visual Studio 2010 SP1 构建的较新的 .Net 应用程序中使用。因为我必须使用 /MT 开关,所以我必须创建一个 DLL 来将类创建和函数导出到 CLR DLL 项目,并将它们包装到一个新类中。

第一个非托管 DLL 的源是这样的,编译/链接到 DLL 没有问题:

CPP_Network.h

#include "smile.h"

#pragma once

#ifndef DllExport
#define DllExport    __declspec( dllexport )
#endif

#if defined(__cplusplus)
extern "C"
{
#endif

DllExport DSL_network* DSL_network_Create();
DllExport void DSL_network_Release(DSL_network* instance);

#if defined(__cplusplus)
}
#endif

CPP_Network.cpp

#include "CPP_Network.h"

DSL_network* DSL_network_Create()
{
    return new DSL_network();
}

void DSL_network_Release(DSL_network* instance)
{
    if (instance != NULL)
        delete instance;
}

托管包装源是这样的,但会在下面生成链接器错误:

CLR_Network.h

#pragma once

#define SMILE_VC_NO_AUTOLINK
#define SMILEXML_VC_NO_AUTOLINK
#define SMILEARN_VC_NO_AUTOLINK

#include "CPP_Network.h"

using namespace System;

namespace smile {
    public ref class Network
    {
    private:
        DSL_network *instance;
    public:
        Network();
        ~Network();
    };
}

CLR_Network.cpp

#include "stdafx.h"

#include "CLR_Network.h"

smile::Network::Network()
{
    instance = DSL_network_Create();
}

smile::Network::~Network()
{
    DSL_network_Release(instance);
    instance = 0;
}

链接到非托管 DLL 时出现以下链接错误:

error LNK2028: unresolved token (0A0004C3) "public: __thiscall DSL_doubleArray::DSL_doubleArray(class DSL_doubleArray const &)" (??0DSL_doubleArray@@$$FQAE@ABV0@@Z) referenced in function "public: __thiscall DSL_Dmatrix::DSL_Dmatrix(class DSL_Dmatrix const &)" (??0DSL_Dmatrix@@$$FQAE@ABV0@@Z)
error LNK2028: unresolved token (0A0004C4) "public: void __thiscall DSL_doubleArray::CleanUp(void)" (?CleanUp@DSL_doubleArray@@$$FQAEXXZ) referenced in function "public: __thiscall DSL_doubleArray::~DSL_doubleArray(void)" (??1DSL_doubleArray@@$$FQAE@XZ)
error LNK2028: unresolved token (0A0004C6) "public: int __thiscall DSL_intArray::SetSize(int)" (?SetSize@DSL_intArray@@$$FQAEHH@Z) referenced in function "public: __thiscall DSL_intArray::DSL_intArray(class DSL_intArray const &)" (??0DSL_intArray@@$$FQAE@ABV0@@Z)
error LNK2019: unresolved external symbol "public: void __thiscall DSL_doubleArray::CleanUp(void)" (?CleanUp@DSL_doubleArray@@$$FQAEXXZ) referenced in function "public: __thiscall DSL_doubleArray::~DSL_doubleArray(void)" (??1DSL_doubleArray@@$$FQAE@XZ)
error LNK2019: unresolved external symbol "public: int __thiscall DSL_intArray::SetSize(int)" (?SetSize@DSL_intArray@@$$FQAEHH@Z) referenced in function "public: __thiscall DSL_intArray::DSL_intArray(class DSL_intArray const &)" (??0DSL_intArray@@$$FQAE@ABV0@@Z)
error LNK2019: unresolved external symbol "public: __thiscall DSL_doubleArray::DSL_doubleArray(class DSL_doubleArray const &)" (??0DSL_doubleArray@@$$FQAE@ABV0@@Z) referenced in function "public: __thiscall DSL_Dmatrix::DSL_Dmatrix(class DSL_Dmatrix const &)" (??0DSL_Dmatrix@@$$FQAE@ABV0@@Z)

我在smile.lib 上运行dumpbin 并看到以下链接:

??0DSL_doubleArray@@QAE@ABV0@@Z

在上面运行 undname 和链接器正在寻找的那个会显示相同的函数声明:

C:\>undname ??0DSL_doubleArray@@QAE@ABV0@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??0DSL_doubleArray@@QAE@ABV0@@Z"
is :- "public: __thiscall DSL_doubleArray::DSL_doubleArray(class DSL_doubleArray const &)"

C:\>undname ??0DSL_doubleArray@@$$FQAE@ABV0@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??0DSL_doubleArray@@$$FQAE@ABV0@@Z"
is :- "public: __thiscall DSL_doubleArray::DSL_doubleArray(class DSL_doubleArray const &)"

我猜测较新的编译器正在寻找更新版本的链接。有没有办法让这项工作以某种方式更正引用?

4

0 回答 0