почему я не могу обернуть методы из одной DLL, но могу сделать это для другой? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь написать оболочку на c ++ / cli для DLL, код которой у меня отсутствует, только файл DLL и заголовок, но я создал файл lib через командную строку VS.Когда я пытаюсь построить решение, я получаю следующие ошибки:

DotNetWrappOfAsterSdkDll.obj : error LNK2028: unresolved token (0A00002E) "void __stdcall MuteClearLastError(void)" (?MuteClearLastError@@$$FYGXXZ) referenced in function "public: void __clrcall DotNetWrappOfAsterSdkDll::WrapperClass2::doMuteClearLastError(void)" (?doMuteClearLastError@WrapperClass2@DotNetWrappOfAsterSdkDll@@$$FQ$AAMXXZ)
DotNetWrappOfAsterSdkDll.obj : error LNK2019: unresolved external symbol "void __stdcall MuteClearLastError(void)" (?MuteClearLastError@@$$FYGXXZ) referenced in function "public: void __clrcall DotNetWrappOfAsterSdkDll::WrapperClass2::doMuteClearLastError(void)" (?doMuteClearLastError@WrapperClass2@DotNetWrappOfAsterSdkDll@@$$FQ$AAMXXZ)

Я пытался создать свою собственную DLL и включить ее в оболочку, и она прекрасно работает

здесь dll, созданныйя, который я могу использовать в оболочке c ++ / cli:

//header file
#pragma once
#define DLLEXP   __declspec( dllexport )
namespace Computations {
    DLLEXP void someMethod(int number);
}

//cpp file
#include "Computations.h"
#include <iostream>
#include <time.h>
//#include "pnl/pnl_random.h"

using namespace std;


void Computations::someMethod(int number)
{
    std::cout << "something "<<number*number << endl;
}

, и вот часть заголовка DLL, которую я хочу использовать:

#ifndef MUTEIFC_H
#define MUTEIFC_H

#include <Windows.h>

#ifdef MUTEIFC_LIBRARY
#  define MUTEAPI  extern "C"__declspec(dllexport)
#else
#  define MUTEAPI __declspec(dllimport)
#endif

#define MUTECALL __stdcall

/** \ingroup init */
/** Initialization of the ASTER SDK library
  * \returns TRUE - success, FALSE - failure (use \ref MuteLastErrorCode or/and \ref MuteLastErrorInfo to get
  *                 failure cause)
  * \note This function will require Administrative privileges on the first call on a given computer.
  */
MUTEAPI BOOL MUTECALL MuteIfcInitialize(VOID);


/** \ingroup init */
/** Finialization of the ASTER SDK library
  */
MUTEAPI VOID MUTECALL MuteIfcFinalize(VOID);

/** \ingroup errors*/
/** Clears the calling thread's last-error code and description.
  * The last-error is maintained on a per-thread basis. Multiple threads do not overwrite each other's last-error.
  */
MUTEAPI VOID MUTECALL MuteClearLastError(VOID);
#endif // MUTEIFC_H

и мой код c ++ / cli:

//header file
#pragma once
#include "Computations.h"
#include "muteifc.h"

using namespace System;

namespace DotNetWrappOfAsterSdkDll
{
    public ref class WrapperClass2
    {
        public:
        void doMuteClearLastError();
    };

    public ref class WrapperClass
    {
    private:
    public:
        void getPriceCallEuro(int number);

    };

}

//cpp file
#include "DotNetWrappOfAsterSdkDll.h"

using namespace DotNetWrappOfAsterSdkDll;

using namespace Computations;

namespace DotNetWrappOfAsterSdkDll
{
        //this dont work
    void WrapperClass2::doMuteClearLastError() {
        MuteClearLastError();
    }
        //this works great
    void WrapperClass::getPriceCallEuro(int number) {
        someMethod(number);
        //MuteIfcFinalize();
    }
}

Пожалуйста, скажите мне, что я делаю не так

1 Ответ

0 голосов
/ 13 февраля 2019

Возможно, вы не добавили библиотеку, которая содержит ссылку на функцию, к параметрам компоновщика.

Либо библиотека содержит сам код, либо она имеет ссылку на библиотеку DLL, которая должна быть загружена.Линкер объединит ваш код и код DLL (или статической библиотеки) вместе ...

...