Manage C++包装Native C++类的例子

Native C++
 
   1:  #include 
  
  
   2:   
   3:  class CPPClass
   4:  {
   5:  public:
   6:    CPPClass(void) {};
   7:  public:
   8:    ~CPPClass(void) {};
   9:   
  10:    void produceByteArray(unsigned char* array, int length)
  11:    {
  12:      printf("CPPClass: Producing %i elements/n", length);
  13:      for (int i=0; i
  
  

  
   
   
  14:      {
  15:        array[i] = i*2;
  16:      }
  17:    }
  18:  };

包装后的Managed C++

   1:  using namespace System;
   2:  #include "CPPClass.h"
   3:   
   4:  namespace SimpleInterop
   5:  {
   6:    public ref class ManagedWrapperClass
   7:    {
   8:    public:
   9:      ManagedWrapperClass(void) { _pCPPClass = new CPPClass(); };
  10:   
  11:      // Wrapper method for the produceByteArray C++ method
  12:      // array
   
   
    
    ^ represents a managed byte array
   
   
  13:      void produceByteArray(array<byte>^ data)
  14:      {
  15:        // The following line fixes the managed array to a pointer. This avoids
  16:        // that the address of the array is changed by the garbage collector.
  17:        pin_ptr<byte> p = &data[0];
  18:        _pCPPClass->produceByteArray(p, data->Length);
  19:      }
  20:   
  21:    private:
  22:      CPPClass* _pCPPClass;
  23:    };
  24:  }

在C#中使用

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:   
   5:  namespace SimpleInterop
   6:  {
   7:    class Program
   8:    {
   9:      static void Main(string[] args)
  10:      {
  11:        ManagedWrapperClass CPPClass = new ManagedWrapperClass();
  12:   
  13:        // Test the produceByteArray method
  14:        byte[] data = new byte[10];
  15:        CPPClass.produceByteArray(data);
  16:        foreach (byte element in data) { Console.WriteLine(element); }
  17:   
  18:        Console.WriteLine("Press return");
  19:        Console.Read();
  20:      }
  21:    }
  22:  }

原帖:http://blog.naiznoiz.com/2008/01/cc-interop-a-simple-example

### 错误原因分析 在开发嵌入式系统时,遇到 `arm-eabi-gcc: not found` 的错误通常是因为未正确配置 ARM 编译工具链的路径[^2]。这表明当前环境中缺少必要的交叉编译器支持,或者其可执行文件未被加入到系统的 `$PATH` 中。 对于 MCU_Code 项目重建失败以及无法使用默认的 ARM 编译器版本 5 的情况,可能的原因包括但不限于以下几点: 1. **ARM 工具链缺失**:目标平台所需的特定版本的 ARM 编译器尚未安装。 2. **环境变量未设置**:即使已安装所需版本的编译器,但如果未将其二进制目录添加至 `$PATH` 变量,则仍然会报找不到该工具的错误。 3. **不兼容性问题**:某些旧版软件包可能存在与现代操作系统之间的依赖冲突,从而导致即便存在相应工具也无法正常工作。 针对以上提到的具体情形——即希望选用恰当版本之 ARM 编译器来修复此状况,以下是具体解决方案及其操作指南。 --- ### 解决方案 #### 方法一:确认现有工具链状态 先验证本地机器上是否存在任何版本的 ARM GCC 并检查它们的位置: ```bash which arm-eabi-gcc ``` 如果没有返回有效路径,则说明确实不存在这样的程序实例;反之则记录下实际位置以便后续调整 PATH 设置。 #### 方法二:下载匹配需求的预构建发行版 访问官方站点或其他可信资源获取对应架构及功能特性的 GNU Toolchain 版本。例如可以从 [GNU Arm Embedded](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)[^3] 下载最新稳定发布的压缩包形式分发件。 完成下载之后解压至合适的目标目录比如 `/opt/gcc-arm-none-eabi-<version>` 或者个人家目录下的子文件夹里。 #### 方法三:更新 shell 配置文件以持久化更改 编辑全局范围内的 profile 文件或是用户的专属 .bashrc/.zshrc 等初始化脚本,在其中追加似下面的一行语句用于扩展搜索域: ```bash export PATH=/path/to/newly/unpacked/toolchain/bin:$PATH ``` 记得保存修改后的文档后再重新加载生效: ```bash source ~/.bashrc # 如果是 bash 用户的话 # 或者如果是 zsh 则运行 source ~/.zshrc ``` #### 方法四:指定 Makefile 使用自定义前缀 当多个不同系列甚至相互矛盾的 cross-compilers 同时存在于同一台主机之上时,为了避免混淆可以显式告知 make 命令应该采用哪一个作为基础处理器。假设我们刚刚安置好的那个叫做 'gcc-arm-none-eabi-' ,那么可以在调用之前临时设定 CC 参数如下所示: ```makefile CC=gcc-arm-none-eabi- make all ``` 这样就能强制让整个流程都基于所指派的那个特殊集合来进行处理而不会受到其他干扰因素的影响了。 --- ### 示例代码片段 这里给出一段简单的 C++ 测试源码用来演示如何切换不同的编译选项组合效果对比差异之处: ```cpp // test.cpp #include <iostream> using namespace std; int main() { cout << "Hello from ARM!" << endl; return 0; } ``` 尝试分别利用原生桌面端 native compiler 和新引入的 embedded target 来生成产物并观察区别: ```bash g++ -o hello_native test.cpp # Native compilation /opt/gcc-arm-none-eabi-*/bin/arm-none-eabi-g++ -o hello_arm test.cpp # Cross Compilation ``` --- ### 总结 综上所述,通过适当的方式定位问题根源所在,并采取针对性措施加以纠正即可顺利解决问题。无论是补充遗漏组件还是优化已有布局都能达到预期目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值