1. 程式人生 > 其它 >so 對XXX未定義的引用

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 //////////////////////////////////////////////////

關於這個未定義的引用的錯誤難道就是因為沒有寫函式宣告就會報這個錯誤嗎?
之前沒有相應的庫也會報這個錯誤。