1

我正在尝试构建一个简单的程序来使用 C++ 上的 Caffe2 库进行推理。我从网上拿了一些例子,代码如下:

#include <iostream>
#include "caffe2/caffe2.hpp"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"

using namespace caffe2;
using namespace std;

NetDef m_Init_net, m_Predict_net;
Workspace m_Workspace;
map<string, DeviceOption> m_BlobOptionMap;

void readNetwork(const string& proto_file, const string trained_file) {
    CAFFE_ENFORCE(ReadProtoFromFile(proto_file, &m_Init_net));
    CAFFE_ENFORCE(ReadProtoFromFile(trained_file, &m_Predict_net));
}

bool enableCPU() {
    m_Predict_net.mutable_device_option()->set_device_type((int)CPU);
    m_Init_net.mutable_device_option()->set_device_type((int)CPU);
    for (int i = 0; i<m_Predict_net.op_size(); ++i) {
        m_Predict_net.mutable_op(i)->mutable_device_option()->set_device_type((int)CPU);
    }
    for (int i = 0; i<m_Init_net.op_size(); ++i) {
        m_Init_net.mutable_op(i)->mutable_device_option()->set_device_type((int)CPU);
    }
}

void initializeNetwork() {
    enableCPU();
    CAFFE_ENFORCE(m_Workspace.RunNetOnce(m_Init_net));
    CAFFE_ENFORCE(m_Workspace.CreateNet(m_Predict_net));
}

bool setInput(float* input, vector<TIndex> vInputDims, string sBlobName) {
    if (!m_Workspace.HasBlob(sBlobName)) {
        cerr << "The workspace doesn't have the blob " + sBlobName << endl;
        return false;
    }
    cerr << "Success finding blob " + sBlobName << endl;

    auto _tensor = m_Workspace.GetBlob(sBlobName)->GetMutableTensor(CPU);
    _tensor->Resize(vInputDims);

    cerr << "Dimensions set" << endl;

    auto tensor_ = m_Workspace.GetBlob(sBlobName)->GetMutableTensor(CPU);
    CPUContext context(m_BlobOptionMap[sBlobName]);
    context.SwitchToDevice();
    context.template CopyBytes< CPUContext, CPUContext>(tensor_->size() * sizeof(float), static_cast<void*>(input), tensor_->raw_mutable_data());
    context.FinishDeviceComputation();
    cerr << "Input set" << endl;

    return true;
}

bool run() {
    bool result = m_Workspace.RunNet(m_Predict_net.name());
    return result;
}

TensorCPU getTensorByName(string sBlobName) {
    return TensorCPU(m_Workspace.GetBlob(sBlobName)->Get<TensorCPU>());
}

vector<float> getBlobContentByName(std::string name) {
    TensorCPU cpudata = getTensorByName(name); // need a instance to save
    const float *data = cpudata.data<float>();
    const int size = cpudata.size();
    return std::vector<float>(data, data + size);
}

int main() {
    srand(time(NULL));
    string s1, s2;
    cin >> s1 >> s2;
    readNetwork(s1, s2);
    initializeNetwork();
    getchar();
    float* input = new float[227*227*3];
    for (int i = 0; i < 227 * 227 * 3; i++) input[i] = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);;
    vector<TIndex> inputshape({1,3,224,224});
    setInput(input, inputshape, "data");

    vector<float> result = getBlobContentByName("softmaxout");
    sort(result.begin(), result.end());
    for (int i = 999; i > 990; i--) cout << result[i] << endl;
    return 0;
}

“caffe2/caffe2.hpp”包含编译此代码所需的所有包含文件。此外,我还包括了 protobuf 库和静态库。

不幸的是,它显示以下错误:

1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) protected: __cdecl c10::intrusive_ptr_target::intrusive_ptr_target(void)" (__imp_??0intrusive_ptr_target@c10@@IEAA@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __cdecl at::BaseContext::BaseContext(void)" (__imp_??0BaseContext@at@@QEAA@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __cdecl at::BaseContext::SwitchToDevice(void)" (__imp_?SwitchToDevice@BaseContext@at@@QEAAXXZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class caffe2::TypeIdentifier __cdecl caffe2::TypeMeta::Id<class caffe2::Tensor>(void)" (__imp_??$Id@VTensor@caffe2@@@TypeMeta@caffe2@@SA?AVTypeIdentifier@1@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class caffe2::TypeIdentifier __cdecl caffe2::TypeMeta::Id<float>(void)" (__imp_??$Id@M@TypeMeta@caffe2@@SA?AVTypeIdentifier@1@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void (__cdecl*__cdecl caffe2::TypeMeta::dtor(void)const )(void *,unsigned __int64)" (__imp_?dtor@TypeMeta@caffe2@@QEBAP6AXPEAX_K@ZXZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: void (__cdecl*__cdecl caffe2::TypeMeta::ctor(void)const )(void *,unsigned __int64)" (__imp_?ctor@TypeMeta@caffe2@@QEBAP6AXPEAX_K@ZXZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: unsigned __int64 const & __cdecl caffe2::TypeMeta::itemsize(void)const " (__imp_?itemsize@TypeMeta@caffe2@@QEBAAEB_KXZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class caffe2::TypeIdentifier const & __cdecl caffe2::TypeMeta::id(void)const " (__imp_?id@TypeMeta@caffe2@@QEBAAEBVTypeIdentifier@2@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) private: __cdecl caffe2::TypeMeta::TypeMeta(class caffe2::TypeIdentifier,unsigned __int64,void (__cdecl*)(void *,unsigned __int64),void (__cdecl*)(void const *,void *,unsigned __int64),void (__cdecl*)(void *,unsigned __int64))" (__imp_??0TypeMeta@caffe2@@AEAA@VTypeIdentifier@1@_KP6AXPEAX1@ZP6AXPEBX21@Z3@Z)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __cdecl caffe2::TypeMeta::TypeMeta(void)" (__imp_??0TypeMeta@caffe2@@QEAA@XZ)
1>Source.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static class caffe2::TypeIdentifier __cdecl caffe2::TypeIdentifier::uninitialized(void)" (__imp_?uninitialized@TypeIdentifier@caffe2@@SA?AV12@XZ)
1>D:\UserData\z003yjnk\Documents\Visual Studio 2015\Projects\Project1\x64\Release\Project1.exe : fatal error LNK1120: 12 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

它似乎是一个丢失的 .lib 文件左右。有任何想法吗?

提前致谢。

4

0 回答 0