文档章节

OpenWRT开发之——对C++11的支持

临峰不畏
 临峰不畏
发布于 2015/05/18 15:04
字数 862
阅读 6733
收藏 57

前言

在上篇文章中博主尝试了在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 --version
mips-openwrt-linux-uclibc-gcc (OpenWrt/Linaro GCC 4.8-2014.04 r45222) 4.8.3
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; 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
    `-- Makefile

1 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<string, int> 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-demo
objects=$(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.mk

PKG_NAME:=cpp11-demo
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/cpp11-demo
    SECTION:=utils
    CATEGORY:=Utilites
    TITLE:=$(PKG_NAME)
    DEPENDS:=+libstdcpp
endef

define Build/Prepare
    $(MKDIR) -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)
endef

define Package/cpp11-demo/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin
endef

$(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=1
b=2
num : 12
num : 32
count=44

说明程序正常运行!


总结

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

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


如果大家想与我一起学习新的技术,不防关注我。

© 著作权归作者所有

临峰不畏
粉丝 221
博文 187
码字总数 98583
作品 0
深圳
架构师
私信 提问
加载中

评论(11)

youyouwang
youyouwang
knkl;l
youyouwang
youyouwang

引用来自“youyouwang”的评论

引用来自“GunsNRose”的评论

又有新文章,收收藏

797979797979

oihiuihljhkj79797979jklj;o
youyouwang
youyouwang

引用来自“GunsNRose”的评论

又有新文章,收收藏

797979797979
临峰不畏
临峰不畏 博主

引用来自“tomcatzh”的评论

本来想进来吐槽的,但楼主最后一句把槽吐完了
欢迎指正
t
tomcatzh
本来想进来吐槽的,但楼主最后一句把槽吐完了
临峰不畏
临峰不畏 博主

引用来自“GunsNRose”的评论

又有新文章,收收藏
感谢捧扬
h
hupicat
哈哈
h
hupicat
测试下
GunsNRose
GunsNRose
又有新文章,收收藏
临峰不畏
临峰不畏 博主

引用来自“pengpengxin”的评论

楼主,src下的makefile为什么不是用patsubst,你编译能通过吗?

是的,我编译过了的。patsubst是模式匹配替换,而subst是简单的替换。用subst已经能达到我们的目的了。
OpenWrt学习目标(更新)

最近在研究OpenWrt,总感觉这一看一点那也了解一点,没有目的,也没有重心。 这里,给自己拟定一个目标,就朝着这个目标去学。 目标:在OpenWrt上开发服务器软件,该软件可以通过LuCI进行控制...

临峰不畏
2015/05/01
3.6K
8
OpenWRT开发之——远程debug

想要用gdb对OpenWrt进行远程调试。首先得在OpenWrt目标机上安装gdbserver。 其实在trunk路径下也有gdb的ipk安装包的,不信find一下。 [trunk]$ find bin/ -name "gdb*.ipk"bin/ar71xx/packag...

临峰不畏
2015/05/18
8.7K
9
移植OpenWrt到RT5350

slider >>> Too few posts! (required minimum are 3) (the featured image may be missing) Previous 移植OpenWrt到CuHead Pro WiFi Posted by: zou, baozhu , 三月 13, 2014 CuHead Pro是一......

Pillar_zuo
2014/03/13
23.2K
5
OpenWRT开发之——创建软件包(有更新)

试验步骤 为了达到自己编写一个程序打包成ipk,并能在OpenWRT上运行的目的。我在网上找了些学习的资料。 本人参考的是:如何在OpenWRT上做开发 感谢该网友的耐心解答。虽然有现成的步骤,博主...

临峰不畏
2015/05/04
17.1K
2
为pcDuino安装OpenWrt

OpenWrt是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。OpenWrt支持各种处理器架构,无论是...

酸酸苹果汁
2014/02/18
6.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

还为PDF转Word抓狂?以下神器让你在职场倍受欢迎!

身在职场的你,是否一直在琢磨:如何能让自己在公司更受欢迎?如何才能在办公室里混个好人缘?如何在同事圈里留个好印象?其实,想要让自己成为受欢迎的人,只要让自己成为大家需要的人不就行...

foxit2world
18分钟前
6
0
AndServer+Service打造Android服务器实现so文件调用

so 文件调用 随着 Android 移动安全的高速发展,不管是为了执行效率还是程序的安全性等,关键代码下沉 native 层已成为基本操作。 native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 可以实...

夜幕NightTeam
20分钟前
3
0
Docker下kafka学习三部曲之二:本地环境搭建

在上一章《 Docker下kafka学习,三部曲之一:极速体验kafka》中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来学习如何编写...

程序员欣宸
20分钟前
4
0
萌新推荐!不再为Excel转换PDF发愁,Aspose.Cells for .NET一步到位!

Aspose.Cells for .NET(点击下载)是Excel电子表格编程API,可加快电子表格管理和处理任务,支持构建具有生成,修改,转换,呈现和打印电子表格功能的跨平台应用程序。 将Excel工作簿转换为...

mnrssj
21分钟前
6
0
对于绘画小白怎么画制服?该注意什么?

怎样制作学生服装?想必绘画初学者们常常会想的问题吧,不知道怎样才能画好人物的衣服,别着急,今日就在这儿讲一些关于如何绘画学生衣服校服的教程给我们!期望能够帮到你们! 轻便西装是不...

热爱画画的我
26分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部