我正在尝试用C ++编写和测试一个dll文件,每当我想要文件系统级访问时,我就可以调用它。在尝试使用C ++访问此dll中的方法时,我目前遇到了巨大的麻烦。奇怪的是,我能够在一个单独的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
这是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;
}
}
我还会包含我在编译dll时使用的.def文件:
; 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方法的一些见解,那将非常感激。
答案 0 :(得分:1)
删除此声明:
extern "C" int __stdcall newMain();
并从_tmain调用ADSInterface :: newMain()。
在发布的代码中,您没有定义与该声明匹配的任何内容,是吗?
或者使实现调用另一个,或将其从命名空间拖到全局。