我有一个静态库,其中(除其他外)实现了一个微小的函数,只返回一个const字符串表中的字符串。此函数不会在库中的任何位置调用,但仍然声明为inline
。为清楚起见,它看起来像这样:
namespace flow
{
inline const char* GetName( BYTE methodType );
}
和实施:
const char* flow::GetName( BYTE methodType )
{
if ( methodType < 5 )
return cszNameTable[ methodType ];
return NULL;
}
在另一个项目中,我正在链接这个库。我有正确的.h文件,我的代码中有using namespace flow;
。问题是,我收到链接器错误:
error LNK2001: unresolved external symbol "char const * __cdecl flow::GetName(unsigned char)" (?GetName@flow@@YAPBDE@Z)
现在我可以通过从静态库中的函数声明中删除“inline”关键字来轻松解决此问题。所以这是我的问题:
1)为什么会出现此错误?如何在不修改静态库源代码的情况下修复它(不删除内联关键字)?
2)在静态库函数中使用inline
关键字的好处是什么?未在库本身内部调用?从另一个项目链接到库时,inline
关键字是否有任何影响(我猜它确实如此,但我不确定)?
答案 0 :(得分:5)
1)为什么会出现此错误?如何在不修改静态库源代码的情况下修复它(不删除内联关键字)?
声明 函数没有任何意义inline
。无论如何,你必须在标题中 定义 :
namespace flow
{
inline const char* GetName( BYTE methodType )
{
if ( methodType < 5 )
return cszNameTable[ methodType ];
return NULL;
}
}
2)在未在库本身内部调用的静态库函数中使用inline关键字有什么好处?当从另一个项目链接库时,内联关键字是否有任何影响(我猜它确实如此,但我不确定)?
inline
的效果是,您可以必须在标头中定义该功能,因为 实现 / em> inline
函数必须在该函数被称为的地方可见。
答案 1 :(得分:0)
这是一个古老的主题,但有些人可能仍然想知道:
宣言(.h档案):
const char* flow::GetName( BYTE methodType )
实施(.cpp文件):
extern inline const char* flow::GetName( BYTE methodType )
{
if ( methodType < 5 )
return cszNameTable[ methodType ];
return NULL;
}