OpenWRT開發之——對C++11的支持

jopen 9年前發布 | 14K 次閱讀 OpenWRT C/C++開發

前言

在上篇文章中博主嘗試了在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,表示在編譯過程中開啟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支持,與操作系統沒太大的關系。


如果大家想與我一起學習新的技術,不防關注我。

來自:http://my.oschina.net/hevakelcj/blog/416225

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!