尝试测试DLL时LNK2019错误

时间:2014-08-13 17:01:37

标签: c++ c linker-errors

我使用的是一个应用程序(几周前刚开始,所以我还在学习旧的应用程序)用C语言构建,我的公司希望使用该程序调用外部DLL的能力扩展一些新功能。为此,我开始研究我的POC,这是下面的前两个文件。我们给出的唯一规范是dll必须导出以下函数: extern int __stdcall TestMethod_LoadCustomer(const char * name, char * id); 我尝试按如下方式实现:

TestDLL.h

#define TestDLL_API __declspec(dllexport)
namespace TestDLL
{
        class TestDLL
        {
        public:
                static TestDLL_API int TestMethod_LoadCustomer(const char* name, char* id);
        };
}

TestDLL.cpp

// TestDLL.cpp : Defines the exported functions for the DLL application.
//  
#include "stdafx.h"
#include "TestDLL.h"
#include <string.h>

extern "C" int __declspec(dllexport) __stdcall  TestMethod_LoadCustomer(const char* name, char* id)
{
  if (strlen(name) <= 8) {
    strcpy(id, name);           // name contains customer id
  } else {
    id[0] = 0;                  // Customer not found
  }
  return 0;
}

这两个文件编译正常。当我尝试通过此处显示的单独的小控制台应用程序测试此dll时出现问题: RunTEST.cpp

// RunTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include "TestDLL.h"

using namespace std;
int _tmain()
{
        char* id= "";
        TestDLL::TestDLL::TestMethod_LoadCustomer("77777", id);
        cout << id;
        cin >> id;
        return 0;
}

我正在寻找的是能够将一个字符串传递给调用TestMethod_LoadCustomer()并将其添加到id字段中。

当我真正尝试构建此解决方案时,我收到以下错误:

“错误LNK2019:未解析的外部符号”public:static int __cdecl TestDLL :: TestDLL :: TestMethod_LoadCustomer(char const *,char *)“(?TestMethod_LoadCustomer @ TestDLL @ 1 @ SAHPBDAD @ Z)在函数_wmain中引用”< / p>

我认为它与我试图在我的客户端应用程序中引用它的方式有关,但我不确定。我已经查看了StackOverflow上的其他LNK2019错误,但这些解决方案似乎都没有在这里工作,我没有错误地实现它们。任何人都可以帮助我摆脱这个错误信息吗?

2 个答案:

答案 0 :(得分:0)

在TestDLL.cpp中定义函数时,您没有提到该函数是TestDLL类的成员。

答案 1 :(得分:0)

在TestDLL.cpp文件中缺少两件事:

1)命名空间TestDLL。

2)在方法名称之前的TestDLL ::。

// TestDLL.cpp : Defines the exported functions for the DLL application.
//  
#include "stdafx.h"
#include "TestDLL.h"
#include <string.h>

namespace TestDLL {
extern "C" int __declspec(dllexport) __stdcall  TestDLL::TestMethod_LoadCustomer(const char* name, char* id)
{
  if (strlen(name) <= 8) {
    strcpy(id, name);           // name contains customer id
  } else {
    id[0] = 0;                  // Customer not found
  }
  return 0;
}
}