TA的每日心情 | 奋斗 2016-8-15 09:28 |
---|
签到天数: 222 天 连续签到: 1 天 [LV.7]常住居民III
|
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支持,与操作系统没太大的关系。
|
|