我可以首先说声谢谢,请您抽出宝贵的时间回答我的问题并尝试提供帮助。但是,我已经尝试过在here和here上建议的解决方案,但它们对我没有用。
这是我的问题:
我正在尝试将串行端口类创建为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的)私人:静态无效* MySerial :: MySerialPort :: serial_port_handle”(__imp_ serial_port_handle @ MySerialPort @ MySerial @@ 0PAXA?)C:\冲刺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();
};
}
这是约翰Zwinck解决方案在我的c ++源文件中的代码:
#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;
}
}
希望你们能为我提供解决方案,或者至少将我引向具有有效解决方案的链接。
干杯!
最佳答案
如果要在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();
};
}
关于c++ - C++ DLL项目中无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19316131/