在上篇文章中博主嘗試了在OpenWrt上用C++寫個簡單的程序測試了一下,可行。linux
博主這兩天又瞭解了C++11,裏面的新特性很是令我興奮。好比shared_ptr, lambda, auto都是很是有用的特性。[點擊瞭解C++11]
ios
今天,博言主就嘗試了一下。
c++
聽說,gcc在4.8版本以後就支持c++11了。咱們先檢查一下交叉編譯器的版本。shell
$ 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.
看來是能夠支持的,不過咱們仍是要試了才知道。
學習
在 SDK/package/ 下創建 cpp11-demo 目錄,並建立如下文件結構:測試
[SDK]$ tree package/cpp11-demo/ package/cpp11-demo/ |-- Makefile `-- src |-- main.cpp `-- Makefile 1 directory, 3 files
#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。
ui
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學習筆記]
spa
第2行的 objects 爲推算出的 main.o 文件。
操作系統
其中,CXXFLAGS 指定了 -std=gun++11 或 -std=c++11,表示在編譯過程當中開啓C++11的特性。
.net
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不須要作特殊修改。
與其它沒有什麼特殊之處,都是 make V=s,正常經過。
將生成的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就成功了。
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支持,與操做系統沒太大的關係。
若是你們想與我一塊兒學習新的技術,不防關注我。