vs2015 工程组织与动态加载

这篇具有很好参考价值的文章主要介绍了vs2015 工程组织与动态加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

10.Visual Studio动态加载_哔哩哔哩_bilibili

1.工程组织

vs2015 工程组织与动态加载,c++

① researcher.cpp

#include "nn/nn.h"

#include "nn/factory.h"
#include "nn/factory_impl/factory_impl.h"

#include <iostream>

int main()
{
    int ret = 0;

    factory_i* fct = new factory_impl();
    auto nn = fct->create_nn("dnn");

    const char* data_from_somewhere = "A B C D";
    ret = nn->train(data_from_somewhere, strlen(data_from_somewhere));
    if (0 != ret)
        std::cout << "failed to train the model." << std::endl;

    const char* model_from_somewhere = "k=10;b=200";
    ret = nn->forward(model_from_somewhere, strlen(model_from_somewhere));
    if (0 != ret)
        std::cout << "failed to forward the model." << std::endl;

    delete nn; nn = nullptr;
    delete fct; fct = nullptr;

    return 0;
}

② nn.h

#ifndef __NN_H__
#define __NN_H__

class nn_i
{
public:
    virtual ~nn_i() = default;

    virtual int train(const char* data, size_t data_size) = 0;
    virtual int forward(const char* model, size_t model_size) = 0;
};

#endif

(1)cnn.h

#ifndef __CNN_H__
#define __CNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class cnn : public nn_i
{
public:
    explicit cnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~cnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};
#endif

(2)dnn.h 

#ifndef __DNN_H__
#define __DNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class dnn : public nn_i
{
public:
    explicit dnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~dnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with fully connected layer in dnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with fully connected layer in dnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};

#endif

(3)rnn.h

#ifndef __RNN_H__
#define __RNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class rnn : public nn_i
{
public:
    explicit rnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~rnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};

#endif

③ factory.h

#ifndef __FACTORY_H__
#define __FACTORY_H__

class nn_i;
class factory_i
{
public:
    virtual ~factory_i() = default;
    virtual nn_i* create_nn(const char* name) = 0;
};

#endif

(1)factory_impl.h 

#ifndef __FACTORY_IMPL_H__
#define __FACTORY_IMPL_H__

#include "nn/factory.h"

class nn_i;
class factory_impl : public factory_i
{
public:
    explicit factory_impl();
    virtual ~factory_impl() = default;

    virtual nn_i* create_nn(const char* name) override;
};

#endif

(2)factory_impl.cpp

#include "factory_impl.h"

#include "nn/network_impl/rnn.h"
#include "nn/network_impl/cnn.h"
#include "nn/network_impl/dnn.h"

#include <string>

factory_impl::factory_impl()
{
}

nn_i* factory_impl::create_nn(const char* name)
{
    if (nullptr == name)
        return nullptr;

    const char* conf_from_somewhere = "Hero=Iron Man";

    auto str_name = std::string(name);
    if (str_name == "dnn")
        return new dnn(conf_from_somewhere);
    else if (str_name == "rnn")
        return new rnn(conf_from_somewhere);
    else if (str_name == "cnn")
        return new cnn(conf_from_somewhere);

    return nullptr;
}

2.动态加载 

vs2015 工程组织与动态加载,c++

现在要把上面的工程改成动态加载:

vs2015 工程组织与动态加载,c++ 文章来源地址https://www.toymoban.com/news/detail-606924.html

① network_loader.cpp

#include "nn/nn_api.h"

#include <iostream>
#include <windows.h>

static const char* filename = "libnn.dll";

int main()
{
    /* 1. 加载DLL到当前的地址空间 */
    HMODULE handle =  LoadLibraryA(filename);
    if (!handle)
    {
        std::cout << "failed to load library: "
            << filename << std::endl;
        return -1;
    }

    /* 2. 获取dll导出函数地址 */
    auto func_init_network 
        = (Proc_InitNetwork)GetProcAddress(handle, "InitNetwork");
    auto func_fini_network
        = (Proc_FiniNetwork)GetProcAddress(handle, "FiniNetwork");
    auto func_train_network
        = (Proc_TrainNetwork)GetProcAddress(handle, "TrainNetwork");
    auto func_infer_network
        = (Proc_InferNetwork)GetProcAddress(handle, "InferNetwork");

    /* 3. 调用dll完成我们的功能 */
    func_init_network("dnn");

    const char* data_from_somewhere = "A B C D";
    func_train_network(data_from_somewhere, strlen(data_from_somewhere));

    const char* model_from_somewhere = "k=10;b=200";
    func_infer_network(model_from_somewhere, strlen(model_from_somewhere));

    func_fini_network();

    /* 4. 释放dll */
    FreeLibrary(handle);

    return 0;
}

② api

(1)nn_api.h

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

_declspec(dllexport) int __stdcall InitNetwork(const char* which);

_declspec(dllexport) int __stdcall FiniNetwork();

_declspec(dllexport) int __stdcall TrainNetwork(const char* data, size_t size);

_declspec(dllexport) int __stdcall InferNetwork(const char* model, size_t size);


#ifdef __cplusplus
}
#endif

(2)nn_api.cpp

#include "nn_api.h"

#include "nn/factory_impl/factory_impl.h"
#include "nn/factory.h"
#include "nn/nn.h"

#include <iostream>

static nn_i* g_nn = nullptr;

int InitNetwork(const char* which)
{
    factory_i* fct = new factory_impl();
    g_nn = fct->create_nn(which);

    delete fct;

    return 0;
}

int FiniNetwork()
{
    delete g_nn; g_nn = nullptr;
    return 0;
}

int TrainNetwork(const char* data, size_t size)
{
    if (!g_nn)
        return -1;

    int ret = g_nn->train(data, size);
    if (0 != ret)
        std::cout << "failed to train the model." << std::endl;

    return 0;
}

int InferNetwork(const char* model, size_t size)
{
    if (!g_nn)
        return -1;

    int ret = g_nn->forward(model, size);
    if (0 != ret)
        std::cout << "failed to infert the network." << std::endl;

    return 0;

    return 0;
}

③ nn.h (自此及往下部分 与之前的一致)

#ifndef __NN_H__
#define __NN_H__

class nn_i
{
public:
    virtual ~nn_i() = default;

    virtual int train(const char* data, size_t data_size) = 0;
    virtual int forward(const char* model, size_t model_size) = 0;
};

#endif

(1)cnn.h

#ifndef __CNN_H__
#define __CNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class cnn : public nn_i
{
public:
    explicit cnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~cnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};
#endif

(2)dnn.h

#ifndef __DNN_H__
#define __DNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class dnn : public nn_i
{
public:
    explicit dnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~dnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with fully connected layer in dnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with fully connected layer in dnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};

#endif

(3)rnn.h

#ifndef __RNN_H__
#define __RNN_H__
#include "nn/nn.h"

#include <string>
#include <iostream>

class rnn : public nn_i
{
public:
    explicit rnn(const char* conf)
        : conf_(conf)
    {
    }
    virtual ~rnn() = default;

    virtual int train(const char* data, size_t data_size) override
    {
        std::cout << "train with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

    virtual int forward(const char* model, size_t model_size) override
    {
        std::cout << "forward with Convolution and Pooling layer in cnn." << std::endl;
        return 0;
    }

public:
    std::string conf_;
};

#endif

④ factory.h

#ifndef __FACTORY_H__
#define __FACTORY_H__

class nn_i;
class factory_i
{
public:
    virtual ~factory_i() = default;
    virtual nn_i* create_nn(const char* name) = 0;
};

#endif

(1)factory_impl.h

#ifndef __FACTORY_IMPL_H__
#define __FACTORY_IMPL_H__

#include "nn/factory.h"

class nn_i;
class factory_impl : public factory_i
{
public:
    explicit factory_impl();
    virtual ~factory_impl() = default;

    virtual nn_i* create_nn(const char* name) override;
};

#endif

(2)factory_impl.cpp

#include "factory_impl.h"

#include "nn/network_impl/rnn.h"
#include "nn/network_impl/cnn.h"
#include "nn/network_impl/dnn.h"

#include <string>

factory_impl::factory_impl()
{
}

nn_i* factory_impl::create_nn(const char* name)
{
    if (nullptr == name)
        return nullptr;

    const char* conf_from_somewhere = "Hero=Iron Man";

    auto str_name = std::string(name);
    if (str_name == "dnn")
        return new dnn(conf_from_somewhere);
    else if (str_name == "rnn")
        return new rnn(conf_from_somewhere);
    else if (str_name == "cnn")
        return new cnn(conf_from_somewhere);

    return nullptr;
}

到了这里,关于vs2015 工程组织与动态加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS2022无法打开Silverlight 项目的问题:改用VS2015

    警告: Microsoft Silverlight 已于 2021 年 10 月 12 日终止支持。 Silverlight 开发框架目前仅在 Internet Explorer 10 和 Internet Explorer 11 上受支持,对 Internet Explorer 10 的支持将于 2020 年 1 月 31 日结束。 不会再支持 Chrome、Firefox 或使用 Mac 操作系统的任何浏览器。 根据微软官方的解释: S

    2024年02月05日
    浏览(52)
  • VS2015+opencv 3.4.6开发环境

     这里提供两种下载方法:   1. opencv官网   2. csdn资源下载  2.1 下载opencv-3.4.6 安装包  2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解压完成,解压完成后窗口会自动关闭。

    2024年02月07日
    浏览(33)
  • win10安装Visual Studio 2015(VS2015)提示0x80070643、0x8007066-错误

    遇到问题: 提示: 安装程序失败,打包失败 错误代码:0x80070643 日志错误: Error 0x80070666: Cannot install a product when a newer version is installed 安装VS2015时提示 0x80070643错误 搜到了官网回复:  (网页链接: 安装VS2015时提示 0x80070643错误 - Microsoft Community https://answers.microsoft.com/zh-hans/w

    2024年02月07日
    浏览(56)
  • VS2008 VS2010 VS2015 VS2019不同版本的.sln 和 .csproj的区别

    1、 VS2008 .sln 文件 .csproj 文件 2、VS2010 .sln 文件 .csproj 文件 3、VS2015 .sln 文件 .csproj 文件 4、VS2019 .sln 文件 .csproj 文件

    2024年02月13日
    浏览(40)
  • vs2015调试时无法显示QT变量值

    问题描述:         vs2015调试时无法显示 QT变量值,只能显示地址,导致想要查看变量值的时候,只能想办法打印出来,非常麻烦。如下图:   问题解决:         调试 - 选项 - 调试 - 常规 - 去掉 使用本机兼容性模式,默认是勾选的         亲测可用    

    2024年02月12日
    浏览(34)
  • c# 项目文件 打包成exe安装包 (vs2015)

    1 Visual Studio 2015 必须有相关的打包组件; 2 Visual Studio的打包组件有 InstallShield 和 Visual Studio Installer Projects (安装包:VSI_bundle)组件; 3 Visual Studio Installer Projects还可在VS软件中下载,下载方式如下: a)点中菜单栏的“工具”选项,并选中“扩展和更新”; b)在搜索框输入

    2024年02月05日
    浏览(47)
  • 【Visual Leak Detector】在 VS 2015 中使用 VLD

    使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。 同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 使用前的准备 2. 在 VS 2015 中使用 VLD 2.1 无内存泄漏时的输出报告 2.2 有内存泄漏时的输出报告 3. 无法正常使用的可能原因 参考本人另一篇博客 安装 Visual

    2023年04月15日
    浏览(41)
  • vs2010、vs2015 编译报错:error MSB6006: “CL.exe”已退出,代码为 -1073741515

    问题: 描述: 相同的代码,之前能够编译正常,移动到其他电脑,本次是移动到一台win7虚拟机上,编译(新装系统),出现上述问题。 解决方案: 1、推荐使用everything搜索工具,搜索cl.exe,因为我虚拟机上安装了两个版本vs,分别是vs2010和vs2015: 2、然后双击cl.exe,会出现提示

    2024年02月16日
    浏览(52)
  • DltView在Windows下的编译(QT5.12.4+VS2015)

    1.环境准备 本人以Windows7_X64为例: DltView: V2.20.0  下载地址:Releases · COVESA/dlt-viewer · GitHub Vs2015我下载的是第一个: vs 2015 各版本下载地址_qq_41871314的博客-CSDN博客   QT5.12.4 我下载的是Windows-X86: Index of /official_releases/qt/5.12/5.12.4 Windows SDK(我选第一种在线安装): Windows SDK -

    2024年02月05日
    浏览(54)
  • VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子)

    cuda安装后一般的安装位置在: C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.8 把这个目录下的include和lib分别配置在vs中,安装cuda教程可参考: https://zhuanlan.zhihu.com/p/520995962 (笔者实操ok版本:win11+cuda11.8+cdunn8.2.1.32+trt8.5.3.1)。 另外还要记得添加 附加依赖项 : 不然会报错: err

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包