我有一个静态库(除其他外)实现了一个微型函数,该函数仅从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)为什么会出现此错误?如何在不修改静态库源代码的情况下(不删除inline关键字)对其进行修复?

2)在静态库函数中使用inline关键字有什么好处,该函数在库本身内部未调用?从另一个项目链接到库时,inline关键字是否有任何作用(我想是的,但我不确定)?

最佳答案



函数声明为inline毫无意义。无论如何,您都必须在标题中定义:

namespace flow
{
    inline const char* GetName( BYTE methodType )
    {
        if ( methodType < 5 )
            return cszNameTable[ methodType ];

        return NULL;
    }
}


inline的作用是,您可以而且必须在 header 中定义该函数,因为inline函数的实现必须在调用该函数的位置可见。

关于c++ - 与具有嵌入式功能的静态库链接时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3203365/

10-13 00:04