C Вызов статической функции-члена из внешнего файла

#function #static #call #external #member

#функция #статический #вызов #внешний #Участник

Вопрос:

У меня этот класс определен в Global.h

     class Global
    {
     public:
         static string InttoStr(int num);
    };
  

В Global.cpp , у меня есть

     Global::InttoStr(int num)
    {
        //Code To convert integer into string.
    }
  

Теперь, из SubMove.cpp , когда я вызываю Global::IntToStr(num) Я получаю следующую ошибку:

ошибка LNK2019: неразрешенный внешний символ Global::IntToStr(int), на который ссылается функция SubMove::toString(void)

Затем я сделал функцию нестатической и вызвал ее следующим образом:

       Global g;
      g.InttoStr(num);
  

Но ошибка все еще сохраняется.

Я думал, что это как-то связано с extern, и искал его, но я не мог установить какое-либо соединение. Пожалуйста, помогите.

Комментарии:

1. Не могли бы вы вставить более релевантный код? Из вашего описания трудно представить, в чем может заключаться проблема. Например, не похоже, что «Global::IntToStr(int num) { …» должен компилироваться.

2. Ваше определение, в Global.cpp отсутствует возвращаемое значение. Это то, как написан код, или просто опечатка в вопросе?

3. Как вы компилируете? gcc SubMove.cpp ? Вам необходимо включить оба cpp-файла.

Ответ №1:

Для начала попробуйте это:

 string Global::InttoStr(int num)
{
    //Code To convert integer into string.
}
  

Кроме того, вы вызываете IntToStr из другой библиотеки? Если это так, вам нужно будет экспортировать класс «Global».

Лучше всего использовать заголовок lib (в примере ниже замените LIB_ на имя библиотеки):

 #ifndef SOME_LIB_HEADER
#define SOME_LIB_HEADER

#if defined (LIB_EXPORTS)
    #define LIB_API __declspec(dllexport)
#else
    #define LIB_API __declspec(dllimport)

#endif // SOME_LIB_HEADER
  

Определите LIB_EXPORTS в вашем проекте, являющемся глобальным, включите заголовок lib в Global.h, затем определите класс следующим образом

 class LIB_API Global
{
    // some code for the class definition
};
  

Каждый проект должен иметь свое собственное определение LIB_EXPORTS и LIB_API, такое как DLL1_EXPORTS, DLL1_API, DLL2_EXPORTS, DLL2_API и т.д.

По сути, это заставляет отдельную библиотеку обрабатывать предыдущую dll с помощью __declspec(dllimport) и разрешать все внешние файлы.

Комментарии:

1. Я просто немного исправил эту ошибку, потому что у меня было перечисление в качестве возвращаемого типа, и я продолжал думать, что я правильно объявил метод by в файле cpp; Это бы очень помогло, если бы вы «выделили» строку в возвращаемом типе : ).