2013-10-11 50 views
0

我能否刚开始说我感谢您花时间浏览我的问题并尝试提供帮助。不过,我已经尝试了herehere上提出的解决方案,他们没有为我工作。C++ DLL项目中无法解析的外部符号

这是我的问题: 我试图创建一个串行端口类作为VS12 DLL项目。我有一个头文件“SerialDll.h”,它包含在我的C++源文件“SerialDll.cpp”中。当我尝试建立在Visual Studio 2012的解决方案,我得到以下错误:

错误11错误LNK1120:1周无法解析的外部C:\冲刺7 \ SerialDll \调试\ SerialDll.dll 11 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

当我尝试实施约翰Zwinck的解决方案,这是错误我得到:

错误2错误C2491: 'MySerial :: MySerialPort :: serial_port_handle':dllimport的静态数据成员的定义不允许C:\冲刺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++源文件中的代码,与约翰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

你已经被告知答案(两次),但上面的代码不包括这些问题的答案。为什么不包括你在尝试给你答案时做了什么,显然你做错了一些事情。 – john

+0

这里有两个问题,第一个是C++语言问题,你没有定义'MySerial :: MySerialPort :: serial_port_handle',你只声明了它。你已经多次被告知这个答案(见John Zwinck的答案)。另一个问题是'SERIAL_DLL_API'等符号的属性。我不知道这个答案,也许Shree Kumar说的是正确的,我不知道。但我知道你必须把两件事情都对好。所以实施John Zwinck的答案,然后从那里拿走。 – john

+0

您好@john我之所以没有在这些答案中包含我的尝试,是因为他们没有为我工作,我想按照原样呈现我的代码。你可以在我的回复中看到John Zwinck的问题,当我尝试他的解决方案时,我得到另一个错误。 – BeeLabeille

回答

0

如果您正在寻找到类导出DLL之外,那么你需要使用__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(); 
    }; 
} 
+0

Hi @Shree,我实际上是从这个链接跟随示例[链接] (http://msdn.microsoft.com/en-us/library/vstudio/ms235636.aspx) 我已按照您的建议,但不幸的是,我仍然得到相同的错误。 – BeeLabeille

+0

Hi @shree,的确你是对的。关键是从头文件中的成员声明中省略'SERIAL_DLL_API',并在整个类中实现它。您的解决方案第一次无效的原因是根据此[链接](http://msdn.microsoft.com/en-us/library/vstudio/ms235636.aspx),我认为'SERIAL_DLL_EXPORTS'将是在构建过程中默认是默认定义的,但它不是我在.cpp文件中明确定义的,它只是工作。 非常感谢! – BeeLabeille

+0

编辑:当我作为一个整体导出类作为你的例子,我仍然有同样的错误。所以关键是只从头文件中的serial_port_handle声明中省略'SERIAL_DLL_API',但保留其他声明。不要忘记.cpp文件中'SERIAL_DLL_EXPORTS'的明确定义。 THANKS AGAIN – BeeLabeille

4

答案是完全一样的,因为这回答您联系前面的问题: https://stackoverflow.com/a/17902142/4323

也就是说,你只有声明,而不是分配的存储空间,你的静态成员。您需要添加到您的实现文件:

namespace MySerial 
{ 
    HANDLE MySerialPort::serial_port_handle; 
} 
+0

嗨@JohnZwinck,谢谢你的回复。这是我如何在我的C++源文件中实现你的解决方案: – BeeLabeille

+0

嗯,对于先前的评论感到抱歉,我在编辑回复框中的代码块时遇到了问题 – BeeLabeille