Возникли проблемы при импорте функции из 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.
В опубликованном коде вы не определили ничего, что соответствовало бы этой декларации, не так ли?
Или сделайте реализацию, вызывающую другую, или перетащите ее из пространства имен в глобальное.