Вызов функции в заголовке другого файла с неопределенной ссылкой

Прежде всего, я хотел бы сказать, что я немного неопытен с c ++.

Я работаю над проектом для университета, используя catkin. В нем у меня 3 файла (соответствующих данному вопросу), TestCode.cpp, RobotInfo.cpp а также RobotInfo.h.

И у них есть следующий код внутри них:

TestCode.cpp

#include "RobotInfo.h"
int main(int argc, char **argv) {
....
Joints::size(); //first time any call goes to Joints
...
}

RobotInfo.h

class Joints{
protected:
static map<string, double> info;

public:
static int size();
}

RobotInfo.cpp

#include "RobotInfo.h"
map<string, double > Joints::info = map<string, double>();

int Joints::size() {
return (int) info.size();
}

Плюс все они были добавлены в CMakeLists.txt.

Теперь каждый раз, когда я пытаюсь запустить его, я получаю следующую ошибку: неопределенная ссылка на `Joints :: size () ‘ , указывая на строку вызова size () в TestCode.cpp.

Если я изменю include в TestCode.cpp на #include «RobotInfo.cpp», все будет нормально, но для меня это выглядит как грязное решение.

Так что я хотел бы знать, что может быть причиной этой проблемы, я пытался решить ее часами, но, похоже, мой недостаток опыта действительно вредит мне в этом.

Также вот все, что выводит консоль, когда я ее собираю:

/home/manuel/clion-2017.1.1/bin/cmake/bin/cmake --build /home/manuel/catkin_ws/src/cmake-build-debug --target testCode -- -j 4
Scanning dependencies of target testCode
[ 50%] Building CXX object team1/CMakeFiles/testCode.dir/src/TestCode.cpp.o
[100%] Linking CXX executable ../devel/lib/team1/testCode
CMakeFiles/testCode.dir/src/TestCode.cpp.o: In function `main':
/home/manuel/catkin_ws/src/team1/src/TestCode.cpp:32: undefined reference to `Joints::size()'
collect2: error: ld returned 1 exit status
team1/CMakeFiles/testCode.dir/build.make:113: recipe for target 'devel/lib/team1/testCode' failed
make[3]: *** [devel/lib/team1/testCode] Error 1
CMakeFiles/Makefile2:784: recipe for target 'team1/CMakeFiles/testCode.dir/all' failed
make[2]: *** [team1/CMakeFiles/testCode.dir/all] Error 2
CMakeFiles/Makefile2:796: recipe for target 'team1/CMakeFiles/testCode.dir/rule' failed
make[1]: *** [team1/CMakeFiles/testCode.dir/rule] Error 2
Makefile:446: recipe for target 'testCode' failed
make: *** [testCode] Error 2

РЕДАКТИРОВАТЬ:

Я понял это, это была глупая ошибка с моей стороны, я допустил ошибку в своих CMakeLists и не собирал оба файла вместе, особая благодарность @NathaOliver за то, что указал мне на это. И извините за тратить ваше время на такую ​​простую проблему.

0

Решение

Ваш .cpp ожидает return:

int Joints::size() {
return (int) info.size();
}

Ваш .h является void:

static void size();

Ваш звонок void (и неправильно):

Joints::size();

Примечание: объявить объект Joints введите, затем позвоните size() (и любые другие функции) на этом объекте. Подобно:

Joints MyObject;
int size = MyObject.size();
2

Другие решения

Проблема заключалась в том, что я допустил ошибку в моих CMakeLists, и он не компилировал RobotInfo.cpp вместе с TestCode.cpp, поэтому при вызове RobotInfo.h он не мог найти реализацию и выдает ошибку.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector