so 对XXX未定义的引用

make all -j1
CXX/LD -o .build_release/tools/create_label_map.bin
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::peek()’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<caffe::AnnotatedDatum>::push(caffe::AnnotatedDatum const&)’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::push(cv::Mat const&)’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::~BlockingQueue()’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::BlockingQueue()’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::size() const’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<caffe::AnnotatedDatum>::size() const’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<caffe::AnnotatedDatum>::peek()’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘void caffe::caffe_rng_uniform<int>(int, int, int, int*)’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<caffe::AnnotatedDatum>::pop()’未定义的引用
.build_release/lib/libcaffe-nv.so:对‘caffe::BlockingQueue<cv::Mat>::pop()’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:666: recipe for target '.build_release/tools/create_label_map.bin' failed
make: *** [.build_release/tools/create_label_map.bin] Error 1

现在这个出错发生在我把nvcaffe0.16.4的一个数据处理层迁移到0.17.0上面。修改了无数个地方,眼看要编译通过了最后报这个未定义的引用,无从下手。都凌晨1点了,太累了就心有不甘的关电脑躺床上睡觉,但是脑子很活跃啊就是睡不着,可真难受。太难了。

然后第二天6点就醒了起来弄。
分析这个错误总共有2个模板感觉有问题。BlockingQueue和caffe_rng_uniform。
然后我去对比0.16.4和0.17.0的定义BlockingQueue的cpp,一对比我就知道问题所在了!
正如报错的提示的,未定义。

可以看到在blocking_queue.cpp最下面还是写了所需要用到的类型。也就是说需要把自己要用到的类型显式的写在这,作为一个头文件定义写在这里。
原来模板还需要这样!

template class BlockingQueue<int>;
template class BlockingQueue<shared_ptr<Batch>>;
template class BlockingQueue<shared_ptr<Datum>>;
template class BlockingQueue<shared_ptr<AnnotatedDatum>>;
template class BlockingQueue<P2PSync*>;
template class BlockingQueue<shared_ptr<caffe::TBlob<float>>>;
template class BlockingQueue<shared_ptr<caffe::TBlob<double>>>;
template class BlockingQueue<shared_ptr<caffe::TBlob<float16>>>;

}  // namespace caffe

加上和错误提示的类型就可以。
template class BlockingQueuecv::Mat;
template class BlockingQueue;

同样的。caffe_rng_uniform也需要加上用到的都是int的类型。

template
void caffe_rng_uniform<float>(int n, float a, float b, Blob* blob);
template
void caffe_rng_uniform<double>(int n, double a, double b, Blob* blob);
template<>
void caffe_rng_uniform<float16>(int n, float16 a, float16 b, Blob* blob) {
  caffe_rng_uniform(n, static_cast<float>(a), static_cast<float>(b), blob);
}
template
void caffe_rng_uniform<float>(int n, float a, float b, float* r);
template
void caffe_rng_uniform<double>(int n, double a, double b, double* r);
template
void caffe_rng_uniform<int>(int n, int a, int b, int* r);/////add //////////////////////////////////////////////////

关于这个未定义的引用的错误难道就是因为没有写函数声明就会报这个错误吗?
之前没有相应的库也会报这个错误。

posted @ 2022-05-18 14:48  无左无右  阅读(297)  评论(0编辑  收藏  举报