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

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

  • 相关阅读:
    C#计算一段程序运行时间的三种方法
    jquery easyui combobox设置默认选中第一项
    ASP.NET Web API教程 分页查询
    ASP.NET Web Api 实现数据的分页
    开源.net 混淆器ConfuserEx介绍
    C#软件license管理(简单软件注册机制)
    MyBatis入门实例-包括实体类与数据库字段对应&CLOB字段处理
    MyBatis在insert插入操作时返回主键ID的配置
    MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
    关于java中split的使用
  • 原文地址:https://www.cnblogs.com/yanghailin/p/16284664.html
Copyright © 2020-2023  润新知