打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenWRT开发之——对C++11的支持
摘要: 在OpenWrt上尝试C++11的特性

前言

在上篇文章中博主尝试了在OpenWrt上用C++写个简单的程序测试了一下,可行。

博主这两天又了解了C++11,里面的新特性非常令我兴奋。比如shared_ptr, lambda, auto都是非常有用的特性。[点击了解C++11]

今天,博言主就尝试了一下。


正文

1. 检查gcc版本

据说,gcc在4.8版本之后就支持c++11了。我们先检查一下交叉编译器的版本。

$ cd SDK    #进入OpenWrt的SDK路径$ cd ./staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/$ ./mips-openwrt-linux-uclibc-gcc --versionmips-openwrt-linux-uclibc-gcc (OpenWrt/Linaro GCC 4.8-2014.04 r45222) 4.8.3Copyright (C) 2013 Free Software Foundation, Inc.This is free software; see the source for copying conditions.  There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

看来是可以支持的,不过我们还是要试了才知道。


2. 编辑文件

在 SDK/package/ 下建立 cpp11-demo 目录,并创建以下文件结构:

[SDK]$ tree package/cpp11-demo/package/cpp11-demo/|-- Makefile`-- src    |-- main.cpp    `-- Makefile1 directory, 3 files


2.1 src/main.cpp

#include <iostream>#include <map>using namespace std;int main(){    cout << "Hello, It's work!" << endl;    auto i = 1;    auto d = 0.57;    auto str = "Hello";    //-----------------------------------------------    map<stringint> m {{"a",1}, {"b",2}};    for (const auto &p : m) {        cout << p.first << "=" << p.second << endl;    }    //-----------------------------------------------    int count = 0;    auto print_num = [&count] (int num) {        cout << "num : " << num << endl;        count += num;    };    print_num(12);    print_num(32);    cout << "count=" << count << endl;}

在main.cpp里面,我用到了C++11里的新特性:auto, for, lambda。


2.2 src/Makefile

target:=cpp11-demoobjects=$(subst .cpp,.o,$(wildcard *.cpp))CXXFLAGS += -std=gnu++11$(target):$(objects)    $(CXX) -o $@ $^clean:    -@rm $(target)    -@rm $(objects)

最近学习了Makefile写法之后,Makefile写起来也简洁了不少。关于Makefile,请访问 [Makefile学习笔记]

第2行的 objects 为推算出的 main.o 文件。

其中,CXXFLAGS 指定了 -std=gun++11 或 -std=c++11,表示在编译过程中开启C++11的特性。


2.3 Makefile

include $(TOPDIR)/rules.mkPKG_NAME:=cpp11-demoPKG_RELEASE:=1PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/cpp11-demo    SECTION:=utils    CATEGORY:=Utilites    TITLE:=$(PKG_NAME)    DEPENDS:=+libstdcppendefdefine Build/Prepare    $(MKDIR) -p $(PKG_BUILD_DIR)    $(CP) ./src/* $(PKG_BUILD_DIR)endefdefine Package/cpp11-demo/install    $(INSTALL_DIR) $(1)/usr/bin    $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/binendef$(eval $(call BuildPackage,cpp11-demo))

打包相关的Makefile不需要做特殊修改。


3.打包安装执行

3.1 编译打包

与其它没有什么特殊之处,都是 make V=s,正常通过。


3.2 安装

将生成的ipk文件用scp传送到 OpenWrt目标机上。

[SDK]scp bin/ar71xx/packages/base/cpp11-demo_1_ar71xx.ipk root@192.168.1.2:root@192.168.1.2's password: cpp11-demo_1_ar71xx.ipk                       100% 3528     3.5KB/s   00:00

并在目标机上有opkg命令安装

root@OpenWrt:~# opkg install cpp11-demo_1_ar71xx.ipk Installing cpp11-demo (1) to root...Collected errors: * satisfy_dependencies_for: Cannot satisfy the following dependencies for cpp11-demo: *     libstdcpp *  * opkg_install_cmd: Cannot install package cpp11-demo.

由于是C++程序,依赖libstdcpp,我们需要前提安装libstdcpp的安装包。

libstdcpp安装包是在我们编译OpenWrt的trunk路径下。如果我们曾经编译成功了OpenWrt,那么应该会有libstdcpp的安装包。如果不好找,可以用命令搜一下:

$ cd trunk$ find -name "*.ipk" | grep libstdcpp./bin/ar71xx/packages/base/libstdcpp_4.8-linaro-1_ar71xx.ipk

把它安装到OpenWrt目录机上。

安装了libstdcpp之后,再安装cpp11-demo就成功了。


3.3 执行结果

root@OpenWrt:~# cpp11-demo Hello, It's work!a=1b=2num 12num 32count=44

说明程序正常运行!


总结

能在OpenWrt上用C++11进行开发是一件非常令人兴奋的事!它果然可以。

不过这不算是OpenWrt支持C++11吧,应该说是gcc支持,与操作系统没太大的关系。


如果大家想与我一起学习新的技术,不防关注我。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
自己移植Asterisk1.8到OpenWRT下
openWRT添加模块(四)
openwrt框架分析
openWrt软件开发教程1(交叉编译和ipk包生成)
debian9上的openwrt创建自己的IPK软件 | 码农家园
【智能路由器】openwrt创建用户软件包
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服