代码之家  ›  专栏  ›  技术社区  ›  PeterK

针对具有内联函数的静态库进行链接时出现问题

  •  2
  • PeterK  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  5
  •   sbi    15 年前

    1) 为什么会出现此错误?如何在不修改静态库源代码(不删除inline关键字)的情况下修复它?

    这是没有意义的 声明 功能如下 inline . 你必须这样 定义

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

    2) 在没有在库本身内部调用的静态库函数中使用inline关键字有什么好处?当链接到另一个项目的库时,inline关键字有什么影响吗(我猜有,但我不确定)?

    影响 内联 你可以,而且 不得不 ,在标头中定义函数,因为 这个 实施 一个 函数必须在调用该函数的位置可见 .

        2
  •  0
  •   Moose    9 年前

    这是一个古老的话题,但有些人可能仍然想知道:

    声明(.h文件):

    const char* flow::GetName( BYTE methodType )
    

    实现(.cpp文件):

    extern inline const char* flow::GetName( BYTE methodType )
    {
        if ( methodType < 5 )
            return cszNameTable[ methodType ];
    
        return NULL;
    }