链接具有内联函数的静态库的问题

时间:2010-07-08 12:10:21

标签: c++ linker inline static-libraries

我有一个静态库,其中(除其他外)实现了一个微小的函数,只返回一个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关键字是否有任何影响(我猜它确实如此,但我不确定)?

2 个答案:

答案 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;
}