调用其他文件未定义引用的头文件中的函数

时间:2017-05-12 18:56:02

标签: c++ ros catkin

首先,我想说我对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()&#39; ,指向TestCode中size()调用的行的.cpp。

如果我将TestCode.cpp中的include更改为#include&#34; RobotInfo.cpp&#34;一切都很好,但对我来说,这看起来像一个肮脏的解决方案。

所以我想知道的是可能导致这个问题的原因,我已经尝试了几个小时来解决这个问题,但似乎我缺乏经验确实伤害了我。

此处还有控制台在构建时输出的所有内容:

/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向我指出这一点。抱歉在这么简单的问题上浪费你的时间。

2 个答案:

答案 0 :(得分:2)

您的.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(); 

答案 1 :(得分:-1)

问题是我在我的CMakeLists中犯了一个错误,并且它没有与TestCode.cpp一起编译RobotInfo.cpp,所以在调用RobotInfo.h时它无法找到实现并且会抛出一个错误。