链接器功能错误

时间:2012-06-09 10:41:45

标签: c++ function linker arguments linker-errors

首先发布在这里,因为我坚持使用我精彩的C ++函数。

我得到的错误是链接器错误,如下所示:

  

main.obj:错误LNK2019:未解析的外部符号“public:void thiscall controls :: printText(int,int,int,int,int,char const *,struct HWND *)”( ?printText @ controls @@ QAEXHHHHHPBDPAUHWND __ @@@ Z)在函数“long stdcall WndProc(struct HWND *,unsigned int,unsigned int,long)”中引用“(?WndProc @@ YGJPAUHWND __ @@ IIJ @ Z)

     

C:\ Users \ HIDDEN \ Documents \ Visual Studio 2010 \ Projects \ TimedShutdown \ Debug \ TimedShutdown.exe:致命>错误LNK1120:1未解析的外部

基本上我正在尝试创建一个用于创建win32控件和绘制文本的类,并且绘制文本的函数是我的问题发生的地方。

代码如下:

  

controls.h文件段: -

void printText( int R, int G, int B, int x, int y, LPCSTR text, HWND parent);
  

controls.cpp段

void printText(int R, int G, int B, int x, int y, LPCSTR text, HWND parent)
{
    HDC hdc;
    PAINTSTRUCT pss;
    hdc = BeginPaint(parent, &pss);
    SetBkMode(hdc, TRANSPARENT);
    SetTextColor(hdc, RGB(R,G,B));
    TextOut(hdc, 30, 20, text, strlen(text));       
    EndPaint(parent, &pss);
}
  

main.cpp调用

controls ctrls;
ctrls->printText(255,0,0,300,50,"Test text",hWnd);

我已删除了通话,但错误仍然存​​在。最初我试图将HDC和PAINTSTRUCT传递给函数,但我在尝试识别错误源时已将其删除。

我完全失去了家伙,我不是一个了不起的C ++程序员,但我正在学习。

批评我,我要求它!

提前感谢您提供的任何帮助,非常感谢:)

2 个答案:

答案 0 :(得分:3)

您忘了告诉编译器printText中的controls.cpp函数是controls::printText。因此,编译器仍未定义。

您需要在controls.cpp修改

// This part is really important
// It tells the compiler which function is defined
//       |
//   vvvvvvvvvv
void controls::printText(int R, int G, int B, int x, int y, LPCSTR text, HWND parent)
{ // ...

注意:传递给printText的颜色可能是R8G8B8,即每个组件8位。如果我是对的,您应该使用unsigned char代替int RGB

答案 1 :(得分:1)

您尚未将controls::指定给您定义它的函数名称。如果你不这样做,你不能指望它表现得像控件类的成员函数。 试试这个而不是你现在的声明

void controls::printText(int R, int G, int B, int x, int y, LPCSTR text, HWND parent)
{
    HDC hdc;
    PAINTSTRUCT pss;
    hdc = BeginPaint(parent, &pss);
    SetBkMode(hdc, TRANSPARENT);
    SetTextColor(hdc, RGB(R,G,B));
    TextOut(hdc, 30, 20, text, strlen(text));       
    EndPaint(parent, &pss);
}

编辑:您在问题中提供的代码中并不清楚您实际上是将printText作为控件的成员函数,但是从代码中调用它的方式表明是你打算如何运作。