我想編寫和測試一個C++的dll文件,我可以調用,只要我想文件系統級訪問的東西。當我試圖在C++中訪問這個DLL中的方法時,我目前非常頭痛。奇怪的是,我能夠在一個單獨的C#程序中調用代碼而沒有什麼麻煩,但我想了解dll交互在C++中如何工作。麻煩從C++ DLL錯誤導入功能LNK 2019
這是我的虛擬可執行文件的.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 [email protected] referenced in function _wmain
error LNK1120: 1 unresolved externals
這裏是adsInterface的.H:
// 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
,這裏是我的adsInterface的.cpp :
// 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;
}
}
我還會加UDE .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函數許多不同的導遊,我已經達到了,我想我只是點以不同的方式混合在一起在各種語言之間輸入,而只是搞亂了一些東西。如果有人能夠提供一些關於我應該如何導入C++中的dll方法的深入瞭解,我們將非常感謝。
''包括'dummy.cpp'中的'#include「adsInterface.h」' –
偉大的工作,感謝所有的幫助。我正在把頭髮撕掉。只是一個小問題,有沒有辦法讓我不必包含頭文件?像這樣我只需要提供該DLL作爲資源? – Drigax
您可以使用正確的聲明,因爲它當前位於標題中 - 位於名稱空間內。你不會把整個麻煩放在名字空間的首位:)。 –