这是我的问题: 我试图创建一个串口类作为VS12 DLL项目。我有一个头文件“SerialDll.h”,它包含在我的c ++源文件“SerialDll.cpp”中。当我尝试在visual studio 2012中构建解决方案时,我得到以下错误:
错误11错误LNK1120:1个未解析的外部C:\ Sprint 7 \ SerialDll \ Debug \ SerialDll.dll 1 1 SerialDll 错误10错误LNK2001:未解析的外部符号“__declspec(dllimport)private:static void * MySerial :: MySerialPort :: serial_port_handle”(__ imp_?serial_port_handle @ MySerialPort @ MySerial @@ 0PAXA)C:\ Sprint 7 \ SerialDll \ SerialDll \ SerialDll。 obj SerialDll
当我尝试实施John Zwinck的解决方案时,这就是我得到的错误:
错误2错误C2491:'MySerial :: MySerialPort :: serial_port_handle':不允许定义dllimport静态数据成员c:\ sprint 7 \ serialdll \ serialdll \ serialdll.cpp 16 1 SerialDll
这是我头文件中的代码:
#include <Windows.h>
#ifdef SERIAL_DLL_EXPORTS
#define SERIAL_DLL_API __declspec(dllexport)
#else
#define SERIAL_DLL_API __declspec(dllimport)
#endif
namespace MySerial
{
class MySerialPort
{
private:
static SERIAL_DLL_API HANDLE serial_port_handle;
public:
SERIAL_DLL_API MySerialPort();
SERIAL_DLL_API ~MySerialPort();
};
}
这是我的c ++源文件中的代码,其中包含John Zwinck的解决方案:
#include "stdafx.h"
#include "SerialDll.h"
#include <stdexcept>
#include <iostream>
using namespace std;
namespace MySerial
{
HANDLE MySerialPort::serial_port_handle;
MySerialPort::MySerialPort()
{
serial_port_handle = INVALID_HANDLE_VALUE;
}
MySerialPort::~MySerialPort()
{
if(serial_port_handle != INVALID_HANDLE_VALUE)
{
CloseHandle(serial_port_handle);
}
serial_port_handle = INVALID_HANDLE_VALUE;
}
}
希望你们能帮助我解决方案,或者至少让我参考一个有效的解决方案链接。
干杯!
答案 0 :(得分:4)
答案与您链接的上一个问题的答案完全相同: https://stackoverflow.com/a/17902142/4323
也就是说,您只为静态成员声明但未分配存储空间。您需要将其添加到您的实现文件中:
namespace MySerial
{
HANDLE MySerialPort::serial_port_handle;
}
答案 1 :(得分:0)
如果要在DLL外部导出类,则需要对类使用__declspec,而不是为每个成员函数/变量使用__declspec。 (见http://msdn.microsoft.com/en-us//library/a90k134d.aspx)
您的头文件需要如下所示:
namespace MySerial
{
class SERIAL_DLL_API MySerialPort
{
private:
static HANDLE serial_port_handle;
public:
MySerialPort();
~MySerialPort();
};
}