Ошибка ссылки SMILE в Visual Studio 2010

Я работаю со старой версией библиотеки C ++ SMILE для байесовского анализа, которая была свободно доступна до того, как ее начали продавать. Я понятия не имею, какой компилятор использовался для создания библиотек, но все, что у меня есть, это заголовочные файлы и файлы lib. Я пытаюсь обернуть эти библиотеки управляемым кодом C ++ для использования в наших новых сборках приложений .Net с Visual Studio 2010 SP1. Поскольку я должен использовать ключ / 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)

Я запустил dumpbin на smile.lib и увидел следующую ссылку:

??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 &)"

Я предполагаю, что новый компилятор ищет более новую версию ссылки. Есть ли способ заставить эту работу исправлять ссылки как-то?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]