zoukankan      html  css  js  c++  java
  • cmake 静态调用 c++ dll 的类的一个例子(Clion IDE)[更新1:增加1.模版的应用,2.ma 的算法]

    CMakeLists.txt

    project(aaa)
    add_library(aaa SHARED aaa.cpp)
    add_executable(bbb bbb.cpp)
    target_link_libraries(bbb aaa)

    aaa.h

    #pragma once
    
    #ifndef AAA_AAA_H
    #define AAA_AAA_H
    #endif
    
    #ifdef BUILD_AAA_DLL
    #define IO_AAA_DLL __declspec(export)
    #else
    #define IO_AAA_DLL __declspec(import)
    #endif
    
    IO_AAA_DLL class father
    {
    private:
        const double PI = 3.14;
    public:
        void hello(void);
        /* 该函数用于介绍 dll 的接口
         *
         */
        double * ma(double *array, int arrayLen, int maLen);
        /* 该函数用于计算 ma 值
         * array    传入数组
         * arrayLen 数组长度
         * maLen    计算天数
         */
    };

    aaa.cpp

    #define BUILD_AAA_DLL
    
    #include "aaa.h"
    #include <iostream>
    
    using namespace std;
    
    IO_AAA_DLL void father::hello(void)
    {
        cout << "+----------------------------------+" << endl;
        cout << "|Hello from class.father.hello()   |" << endl;
        cout << "|             --Made by DengChaohai|" << endl;
        cout << "+----------------------------------+" << endl;
    
    }
    
    double * father::ma(double *array, int arrayLen, int maLen)
    {
        int n = maLen;
        // 保存计算天数
        double ma[arrayLen];
        // 用于保存 ma 值
        while(arrayLen >= maLen && maLen >0)
        // 传入数组长度要大于计算天数
        {
            double sum = 0;
            for(int i = maLen - n; i < maLen; i++)
            // 计算长度不变,但 ma 值计算要一步步移动,
            {
                sum = sum + array[i];
            }
            ma[maLen - 1] = sum / n;
            // 简单的平均值算法
            cout << "wma[" << maLen - 1 << "] = " << ma[maLen - 1] << endl;
            maLen++;
        }
        return ma;
        // 返回数组指针,是否调用再说
    }

    bbb.cpp

    #include "aaa.h"
    #pragma comment(a, "C:UsersPerelman.CLion2016.1systemcmakegeneratedaaa-4d5bae384d5bae38Debuglibaaa.a")
    
    #include <iostream>
    using namespace std;
    
    template <typename t> int getArrayLen(t &array)
    // 应用模版,动态定义数据类型
    {
        return sizeof(array) / sizeof(array[0]);
    }
    
    int main()
    {
        father child;
        child.hello();
        double open[] = {0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23};
        double *p = child.ma(open, getArrayLen(open), 1);
        cout << *(p + 4);
        return 0;
    }
    360截图20160613183325803

    360截图20160613184244117 

    bbb.py

    from ctypes import *
    h = windll.LoadLibrary('C:\Users\Perelman\.CLion2016.1\system\cmake\generated\aaa-4d5bae38\4d5bae38\Debug\libaaa.dll')
    h._ZN6father5helloEv()
    '''调用函数 hello,此函数名由 depends 工具获得'''
    PyList = [0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23]
    '''python 的 list 数据'''
    CArray = (c_double*len(PyList))(*PyList)
    '''转成 c 的 数组格式'''
    h._ZN6father2maEPdii(byref(CArray), 13, 3)
    '''调用函数 ma,参数 1 的指针用 byref 取'''

    1 

    2

  • 相关阅读:
    Win8系统 Python安装
    一些安卓开源框架整理
    Android 媒体键监听以及模拟媒体键盘的实现 demo
    android View 自动 GONE 问题
    Android 定时器TimerTask 简单使用
    关于Android studio 相对 eclipse 优点
    Java序列化与反序列化
    android shape的使用 边框
    Android Studio 修改 包名 package name
    Android WebView Long Press长按保存图片到手机
  • 原文地址:https://www.cnblogs.com/blog-3123958139/p/5581617.html
Copyright © 2011-2022 走看看