Проблема со связыванием со статической библиотекой, которая имеет встроенные функции - PullRequest
2 голосов
/ 08 июля 2010

У меня есть статическая библиотека, которая (помимо прочего) реализует крошечную функцию, которая возвращает только некоторую строку из таблицы константных строк.Эта функция нигде не вызывается внутри библиотеки, но все равно объявлена ​​как 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 ]

5 голосов
/ 08 июля 2010

1) Почему появляется эта ошибка?Как я могу это исправить без изменения исходного кода статической библиотеки (без удаления встроенного ключевого слова)?

Нет никакого смысла в объявлении функций как inline.Вы должны определить их в любом случае в заголовке:

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

        return NULL;
    }
}

2) В чем преимущество использования встроенного ключевого слова в функции статической библиотекичто не вызывается внутри самой библиотеки?Имеет ли ключевое слово inline какой-либо эффект при связывании с библиотекой из другого проекта (думаю, что да, но я не уверен)?

Эффект inline в том, что вы можете, и должен , определить функцию в заголовке, потому что реализация функции inline должна быть видимой там, где эта функция вызывается .

0 голосов
/ 05 июня 2016

Это старая тема, но некоторые все еще могут удивляться:

Декларация (.h файл):

const char* flow::GetName( BYTE methodType )

Реализация (файл .cpp):

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

    return NULL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...