Возникли проблемы при импорте функции из DLL C++ ошибка LNK 2019

Я пытаюсь написать и протестировать DLL-файл на C++, который я могу вызывать всякий раз, когда мне нужен доступ на уровне файловой системы. В настоящее время у меня огромная головная боль при попытке доступа к методам в этой DLL в C++. Как ни странно, мне удалось без особых проблем вызвать код в отдельной программе на C#, но я хочу получить представление о том, как dll-взаимодействие работает в C++.

И это.cpp для моего фиктивного исполняемого файла, который должен вызывать только мой тестовый метод "newMain".

// dummy.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
//#pragma comment(lib,"visa32.lib")
#pragma message("automatic link to adsInterface.dll")
#pragma message(lib, "adsInterface.lib"

extern "C" int __stdcall newMain();

int _tmain(int argc, _TCHAR* argv[])
{
 newMain();
 std::string i;
 std::cin >> i
 return 0;
}

Проблема в том, что при запуске я получаю эту ошибку:

error LNK2019: unresolved external symbol _newMain@0 referenced in function _wmain
error LNK1120: 1 unresolved externals

Вот.h для adsInterface:

// adsInterface.h

#ifndef ADSINTERFACE_H
#define ADSINTERFACE_H

/* //save this for later i have no clue how this really works.
#ifdef ADSAPI_EXPORTS
#define ADSAPI __declspec(dllexport)
#else
#define ADSAPI __declspec(dllexport)
#endif
*/

namespace ADSInterface
{
  //test method. should print to console.
  __declspec(dllexport) int __stdcall newMain();

  void hello();
}
#endif

и вот мой.cpp для adsInterface:

// adsInterface.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "adsInterface.h"
#include <iostream>

namespace ADSInterface
{
  /* this is where the actual internal class and other methods will go */

  void hello()
  {
    std::cout << "hello from the DLL!" << std::endl;
  }


  __declspec(dllexport) int __stdcall newMain()
  {
    hello();
    return 0;
  }
}

Я также включу файл.def, который использовал при компиляции dll:

; adsInterface.def - defines exports for adsInterface.dll

LIBRARY ADSINTERFACE
;DESCRIPTION 'A C++ dll that allows viewing/editing of alternate data streams'

EXPORTS
  newMain @1

Как ни странно, я смог импортировать метод в C# с этой строкой (мне не нужно было также включать файл.lib):

[DllImport("./adsInterface.dll")] private static extern void newMain();

И он побежал, когда я назвал это нормально:

newMain();

Я читал много разных руководств о том, как импортировать функции dll, и я дошел до того, что мне кажется, что я просто объединяю разные способы импорта между языками и просто путаюсь. Если кто-нибудь сможет дать некоторое представление о том, как я должен импортировать dll-методы в C++, это было бы очень полезно.

1 ответ

Решение

Удалить это объявление:

extern "C" int __stdcall newMain();

и вызвать ADSInterface::newMain() из _tmain.

В опубликованном коде вы не определили ничего, что соответствовало бы этой декларации, не так ли?

Или сделайте реализацию, вызывающую другую, или перетащите ее из пространства имен в глобальное.

Другие вопросы по тегам