【发布时间】:2011-03-07 05:20:31
【问题描述】:
我正在学习这个 NeuralNet 课程:
class NeuralNet {
public:
// Public functions
private:
vectors vect; // Point-of-access for functions in class vectors
// Private functions
};
我正在使用这个极其简单的 makefile:
all: nnet.exe
nnet.exe: main.o neuralnet.o vectors.o
g++ -o nnet.exe main.o vectors.o neuralnet.o
main.o: main.cpp neuralnet.h
g++ -ggdb -c main.cpp
vectors.o: vectors.cpp vectors.h
g++ -ggdb -c vectors.cpp
neuralnet.o: neuralnet.cpp neuralnet.h vectors.h
g++ -ggdb -c neuralnet.cpp
clean:
rm -f *.o nnet.exe
当 g++ 运行以构建最终的可执行文件时,我收到以下形式的很多错误:
neuralnet.o: /path/to/neuralnet.cpp: line# : undefined reference to vectors::fn_name(args)
例如,我定义了一个函数:
template<typename T> void fill_vec(vector<T>&, int, double);
当我调用这个函数时,我传递一个声明为vector<double> 类型的变量作为第一个参数,链接器报告undefined reference to void vectors::fill_vec<double>(std::vector<double, std::allocator<double> >&, int, double)
在NeuralNet 的实现中对class vectors 函数的所有调用都是从vect 调用的。但是,neuralnet.cpp 和 neuralnet.h 都包含 "vectors.h" 的包含,所以我假设我在某种程度上链接不正确。
有没有人看到任何明显的东西?
【问题讨论】:
-
neuralnet.h 中是否包含vectors.h?
-
是的,neuralnet 标头还包含vectors.h。编辑问题以立即反映。
-
这听起来很愚蠢 - fn_name() (cAsE sEnSiTiVe) 正在正确使用,对吗?在此错误之后,您没有收到“候选人是...”消息或任何内容吗?顺便说一句,这不是一个链接问题。
g++ -c参数取消链接,直到您的最后一步。 -
@RageD,g++ 提到的文件名是 .o 文件,错误信息是“未定义引用”——这绝对是链接问题。
-
@RageD - 不,没有关于候选函数的任何消息。此外,问题是当使用 g++ 从目标文件构建最终可执行文件时发生错误,也就是应该发生链接的时候。
标签: c++ header linker include makefile