2010-07-08 9 views
2

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

Теперь я могу легко исправить, удалив «инлайн» ключевое слово из объявления функции в статической библиотеке. Итак, вот мои вопросы:

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

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

+0

это может быть очевидно, но является ли реализация в заголовке? – Staffan

+0

Что с '__cdecl' в ошибке? Вы объявляете это «extern» где-то? – Stephen

+0

@ Стаффан: нет, это не так, я не автор кода, у меня есть доступ к нему. Библиотека компилируется, хотя, возможно, поэтому причина, по которой автор не видел эту ошибку (и то же самое со мной, о мальчик) – PeterK

ответ

5

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

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

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

     return NULL; 
    } 
} 

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

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

+0

Действительно. http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6 – Stephen

+1

Итак, причина ошибки компоновщика заключается в том, что реализация не находится в файле заголовка? (как я сказал в комментариях к моему вопросу). – PeterK

+0

На самом деле, вам не нужно определять его «сразу». Вы можете использовать отдельное объявление, за которым следует отдельная реализация. Тем не менее, оба должны быть в заголовке. – Staffan

0

Это старая тема, но некоторые из них могут по-прежнему интересно:

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

const char* flow::GetName(BYTE methodType) 

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

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

    return NULL; 
} 
Смежные вопросы