对已定义函数的未定义引用

Undefined reference to a defined function

本文关键字:未定义 引用 函数 定义      更新时间:2023-10-16

所以我可能正在做一些令人难以置信的愚蠢的事情,只是抓住它,但我一直得到一个未定义的引用,我已经明确定义的函数。在我的一个.cpp文件中,我使用以下命令:

#include "MVec.h"
...
MVec ans;
...
for(int i = 0; i < 3; i++)
    ans[i] = ...

在MVec.h中,我有:

class MVec {
...
inline double & operator[](const int i);
inline const double & operator[](const int i) const;
...
};

最后,在mvec.cpp中,我有:

inline double & MVec::operator[](const int i) {
        #ifdef CHECK_BOUNDS
        if(i < 0 || i >= 3)
                throw("Subscript out of bounds");
        #endif
        return vec[i];
}
inline const double & MVec::operator[](const int i) const {
        #ifdef CHECK_BOUNDS
        if(i < 0 || i >= 3)
                throw("Subscript out of bounds");
        #endif
        return vec[i];
}

然而,当我编译两个。cpp文件并试图链接它们时,

g++ atommanager.cpp -o atommanager.o
g++ mvec.cpp -o mvec.o
g++ atommanager.o mvec.o -o gpumd

我总是得到错误:

atommanager.cpp:(.text+0x76): undefined reference to `MVec::operator[](int)'

这里,atommanager.cpp是我提到的第一个.cpp文件的名称。

定义函数inline不提供外部可见的定义:该定义仅在定义inline函数的翻译中可见(我认为仅适用于inline定义之后的调用,除非该函数也声明为inline)。解决这个问题最简单的方法是删除inline。或者,您需要在header中定义函数。