我正在使用旧版本的 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 &)"
我猜测较新的编译器正在寻找更新版本的链接。有没有办法让这项工作以某种方式更正引用?