无法从C ++ DLL导入函数LNK 2019

时间:2013-06-27 14:33:16

标签: c++ dll import declspec

我正在尝试用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方法的一些见解,那将非常感激。

1 个答案:

答案 0 :(得分:1)

删除此声明:

extern "C" int __stdcall newMain();

并从_tmain调用ADSInterface :: newMain()。

在发布的代码中,您没有定义与该声明匹配的任何内容,是吗?

或者使实现调用另一个,或将其从命名空间拖到全局。