LINUX.ORG.RU

Неопределенная ссылка на *

 , , , ,


0

1

Здравствуйте. У меня есть несколько файлов main.cpp main.h Patient.cpp Patient.h . Компилирую командой: ‘g++ -o main main.cpp Patient.cpp’ Раньше все компилировалось нормально и работало, до того момента как добавил статические методы в class Patient. Вызываю эти методы из функции main способом:

Patient::method();

Так вот, теперь при компиляции вышеуказанной командой выдает кучу ошибок, я так подозреваю связанных с линковкой:


/usr/bin/ld: /tmp/ccX75qLM.o: в функции «addPatient()»:
main.cpp:(.text+0x37b): неопределённая ссылка на «Patient::Patient()»
/usr/bin/ld: main.cpp:(.text+0x42b): неопределённая ссылка на «Patient::isLastname(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)»
/usr/bin/ld: main.cpp:(.text+0x4b8): неопределённая ссылка на «Patient::doLastname(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)»
/usr/bin/ld: main.cpp:(.text+0x613): неопределённая ссылка на «Patient::isDay(int)»
/usr/bin/ld: main.cpp:(.text+0x6dd): неопределённая ссылка на «Patient::isMonth(int)»
/usr/bin/ld: main.cpp:(.text+0x7a7): неопределённая ссылка на «Patient::isYear(int)»
/usr/bin/ld: main.cpp:(.text+0xb6f): неопределённая ссылка на «Patient::isLastname(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)»
/usr/bin/ld: main.cpp:(.text+0xbf7): неопределённая ссылка на «Patient::doLastname(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)»
/usr/bin/ld: main.cpp:(.text+0xcc2): неопределённая ссылка на «Patient::isInit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)»
collect2: error: ld returned 1 exit status

Подскажите пожалуйста в чем у меня проблема и как правильно это все скомпилировать.



Последнее исправление: Concorde (всего исправлений: 2)

Подскажите пожалуйста

Только если ты пообещаешь не отнимать работу у serg002.

неопределённая ссылка на

В файле Patient.cpp есть реализация этих методов?

ox55ff ★★★★★
()

У меня какая-то фигня с разметкой. Заключил в кавычки, но так как у других не отображается. Надеюсь у вас отображается нормально

Concorde
() автор топика
Ответ на: комментарий от Concorde

Надеюсь у вас отображается нормально

Нет. Кавычка нужна та, что на кнопке с буквой Ё.

ox55ff ★★★★★
()
Ответ на: комментарий от Concorde

Не "', a ```. Обратный апостроф там где буква ё на английской раскладке. Ты можешь отредактировать своё сообщение.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от ox55ff

Да, реализация есть в Patient.cpp Вот правда Visual Code эту реализацию почему то не видит , и в файле Patient.h пишет, что

Function definition for ‘isLastname’ not found.

Не знаю что ему не нравится. Может быть Patient:: нужно было ставить, но само же IDE говорит что его нельзя использовать когда метод static

Concorde
() автор топика
Ответ на: комментарий от Concorde

В cpp файле нужно ставить Patient:: перед именем метода. Как по-твоему компилятор поймёт к какому классу относится метод?

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

В cpp файле нужно…

Я немного озадачен вот этим:

Раньше все компилировалось нормально и работало

Акцентирую внимание на «работало».

bugfixer ★★★★★
()
Ответ на: комментарий от ox55ff

Перефразирую: почему раньше вот это не было проблемой?

неопределённая ссылка на «Patient::Patient()»
bugfixer ★★★★★
()
Ответ на: комментарий от ox55ff

Как я и говорил компилятор все равно ругается на Patient::


Patient.cpp:26:33: error: cannot declare member function ‘static bool Patient::isDay(int)’ to have static linkage [-fpermissive]
   26 | static bool Patient::isDay(int d)
      |                                 ^
Patient.cpp:38:35: error: cannot declare member function ‘static bool Patient::isMonth(int)’ to have static linkage [-fpermissive]
   38 | static bool Patient::isMonth(int m)
      |                                   ^
Patient.cpp:50:34: error: cannot declare member function ‘static bool Patient::isYear(int)’ to have static linkage [-fpermissive]
   50 | static bool Patient::isYear(int y)
      |                                  ^
Patient.cpp:62:48: error: cannot declare member function ‘static bool Patient::isLastname(std::string)’ to have static linkage [-fpermissive]
   62 | static bool Patient::isLastname(string lastname)
      |                                                ^
Patient.cpp:81:50: error: cannot declare member function ‘static std::string Patient::doLastname(std::string)’ to have static linkage [-fpermissive]
   81 | static string Patient::doLastname(string lastname)
      |                                                  ^
Patient.cpp:91:41: error: cannot declare member function ‘static bool Patient::isInit(std::string*)’ to have static linkage [-fpermissive]
   91 | static bool Patient::isInit(string* init)

Если что методы выглядят в cpp файле примерно так:


static bool Patient::isDay(int d)
{
    if(d >= 1 && d <= 31)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Concorde
() автор топика
Ответ на: комментарий от Concorde

Все, понял, убрал static в реализации , вроде все скомпилировалось

Concorde
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.