2011-06-05 139 views
0

静态成员函数I已经在Global.h定义该类C++调用从外部文件

class Global 
    { 
    public: 
     static string InttoStr(int num); 
    }; 

在Global.cpp,我有

Global::InttoStr(int num) 
    { 
     //Code To convert integer into string. 
    } 

现在,从SubMove.cpp,当我调用Global :: InttoStr(num)我得到以下错误:

错误LNK2019:无法解析的外部符号Global :: InttoStr(int)在函数中引用SubMove :: toString(void)

然后我做了功能非静态,并把它称为像这样:

 Global g; 
     g.InttoStr(num); 

但错误依然存在。

我认为它与extern有关并且搜索了它但我无法建立任何连接。请帮忙。

+0

你能粘贴更多相关的代码吗?很难想象你的描述会出现什么问题。例如,它看起来不像“Global :: InttoStr(int num){...”应该被编译。 – PAG 2011-06-05 10:43:26

+0

您在Global.cpp中的定义缺少返回值。这是代码的写法,还是只是一个错字? – eran 2011-06-05 10:44:02

+0

你如何编译? 'gcc SubMove.cpp'?您需要包含两个.cpp文件。 – nothrow 2011-06-05 10:47:22

回答

2

首先,试试这个:

string Global::InttoStr(int num) 
{ 
    //Code To convert integer into string. 
} 

而且,你从另一个库调用InttoStr?如果是这样,则需要导出类“全局”。

最好的做法是使用一个lib头(在下面的示例与库的名称替换LIB_):

#ifndef SOME_LIB_HEADER 
#define SOME_LIB_HEADER 

#if defined (LIB_EXPORTS) 
    #define LIB_API __declspec(dllexport) 
#else 
    #define LIB_API __declspec(dllimport) 

#endif // SOME_LIB_HEADER 

定义你的项目LIB_EXPORTS contianing全球,包括在Global.h的lib头,那么像这样定义

class LIB_API Global 
{ 
    // some code for the class definition 
}; 

每个项目的类都应该有自己LIB_EXPORTS和LIB_API定义,就像DLL1_EXPORTS,DLL1_API,DLL2_EXPORTS,DLL2_API等

基本上这使得一个单独的lib用__declspec(dllimport)处理以前的dll并解析所有的extern。

+0

我只是追赶这个bug,因为我有一个枚举作为返回类型,并一直认为我已经正确地声明了方法在cpp文件中;如果您在返回类型中“突出显示”字符串,它将帮助很大:)。 – Jess 2013-05-03 04:23:37