Я работаю со старой версией библиотеки 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 &)"
Я предполагаю, что новый компилятор ищет более новую версию ссылки. Есть ли способ заставить эту работу исправлять ссылки как-то?
Задача ещё не решена.
Других решений пока нет …