NDK编译Boost(Cygwin环境)

  因为mapnik需要部分Boost模块的支持,所以需要编译Boost库。Boost直接在Windows或者Linux下编译并不难,几条指令可以搞定,但是对于交叉编译,正如本文将要阐述的使用NDK进行编译,确实是比较头疼。借助万能的Google和Baidu,我将看到的方法做以整理并进行了亲测。

  不过在这之前,我想阐明一个误区,也是给自己补了个课。就是Boost库在使用的时候,并不是都需要编译的。有一小部分和平台相关的模块必须要编译,大部分直接引用头文件即可以使用。毕竟Boost太过庞大,全部编译浪费时间,按需使用最佳。以下是从Boost官网摘录的说明,在此不做翻译了,这点单词对码农来说,不是事。

The only Boost libraries that must be built separately are:

A few libraries have optional separately-compiled binaries:

  • Boost.DateTime has a binary component that is only needed if you‘re using its to_string/from_string or serialization features, or if you‘re targeting Visual C++ 6.x or Borland.
  • Boost.Graph also has a binary component that is only needed if you intend to parse GraphViz files.
  • Boost.Math has binary components for the TR1 and C99 cmath functions.
  • Boost.Random has a binary component which is only needed if you‘re using random_device.
  • Boost.Test can be used in “header-only” or “separately compiled” mode, although separate compilation is recommended for serious use.
  • Boost.Exception provides non-intrusive implementation of exception_ptr for 32-bit _MSC_VER==1310 and _MSC_VER==1400 which requires a separately-compiled binary. This is enabled by #define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR.

  接下来介绍编译步骤,我是在Windows下使用NDK编译,所以选择了Cygwin的环境,纯Linux下方法大同小异。

  NDK版本:官方版 R10c

  Boost版本:1.57

  1、下载boost_1_57_0.tar.gz,将其放到Cygwin虚拟的Linux目录下,比如/usr/。

  2、打开Cygwin,利用tar zxvf指令将boost_1_57_0.tar.gz解压。

  3、cd到解压后的Boost根目录下,执行 ./bootstrap.sh,生成boost编译工具。

  4、用文本编辑器打开根目录下的project-config.jam文件,修改为如下内容:

import os ;

if [ os.name ] = CYGWIN || [ os.name ] = NT {
    androidPlatform = windows ;
    }
    else if [ os.name ] = LINUX {
    androidPlatform = linux-x86_64 ;
    }
    else if [ os.name ] = MACOSX {
    androidPlatform = darwin-x86 ;
    }  

ANDROID_NDK = <实际的NDK路径> ;
using gcc : android4.9 : $(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-g++ :
<archiver>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ar
<ranlib>$(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.9/prebuilt/$(androidPlatform)/bin/arm-linux-androideabi-ranlib
<compileflags>-I$(ANDROID_NDK)/platforms/android-19/arch-arm/usr/include
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.9/include
<compileflags>-I$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-ffunction-sections
<compileflags>-funwind-tables
<compileflags>-D__ARM_ARCH_5__
<compileflags>-D__ARM_ARCH_5T__
<compileflags>-D__ARM_ARCH_5E__
<compileflags>-D__ARM_ARCH_5TE__
<compileflags>-Wno-psabi
<compileflags>-march=armv5te
<compileflags>-mtune=xscale
<compileflags>-msoft-float
<compileflags>-mthumb
<compileflags>-Os
<compileflags>-fomit-frame-pointer
<compileflags>-fno-strict-aliasing
<compileflags>-finline-limit=64
<compileflags>-Wa,--noexecstack
<compileflags>-DANDROID
<compileflags>-D__ANDROID__
<compileflags>-DNDEBUG
<compileflags>-O2
<compileflags>-g
;  

project : default-build <toolset>gcc-android4.9 ;

# List of --with-<library> and --without-<library>
# options. If left empty, all libraries will be built.
# Options specified on the command line completely
# override this variable.
libraries =  --with-filesystem --with-thread --with-system --with-regex --with-program_options ;

  其中NDK路径请根据实际情况填写,另外gcc的版本也可以根据实际情况进行改动。libraries后面跟需要编写的Boost模块,需要哪个加哪个。

  Ps:此步骤和网上流传的方法有一些出入,按照其说法是” 修改 boost/tools/build/v2/user-config.jam“,但实际Boost1.57中并没有生成此文件,怀疑可能跟新版本中Boost修改了Bjam有关。

  5、执行./b2 toolset=gcc-android4.9 link=static threading=multi target-os=linux --stagedir=android,--stagedir跟生成路径。

  至此,就生成了编译好的Boost模块了。其中第四步的代码是我综合了网上的代码和一个开源项目Boost for Android中的代码,里面有很多编译选项我也不是很懂,希望可以和大家交流。不过有一点可以保证,就是顺利的编译。

  顺便吐槽下,mapnik确实是个很难配置的东西,我花了很长时间才让它能用,因为需要太多的其他库支持,特别是在Android上使用,需要交叉编译。后面有空我会逐一整理出来,也希望有兴趣的朋友一起交流。

  

   

时间: 2024-10-14 13:29:17

NDK编译Boost(Cygwin环境)的相关文章

ndk 编译 boost 库

Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的“准”标准库.Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库.但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎. 在Android的

NDK 编译 boost库

从 GITHUB 上拉别人一个boost工程 https://github.com/moritz-wundke/Boost-for-Android 编译需要MinGW(Min GNU for Window)下载了MinGW 下载器 http://www.mingw.org/wiki/MSYS然后将bin路径加入到path环境变量中C:\MinGW\msys\1.0\bin 执行boost 编译 build-android.bat G:\androidndkr9 Detected Android

Android NDK r10c 编译boost 1.55 (使用Cygwin)

项目用到boost::asio,boost::serialization, Android打包环境配置 ... 做个记录,下次别又掉到这坑里浪费时间 1. 安装Cygwin : 下载Cygwin (http://www.cygwin.com/)  安装时,默认设置,只选择Devel,将后面的Default改为Install,然后就是等了. 安装完后,进入Cygwin的终端,分别 gcc -v 和 make -v 查看版本 配置环境变量,打开vi ~/.bash_profile,添加环境变量exp

[Android]Cygwin使用及NDK编译方法

在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程: 一.准备工作 2.下载Cygwin, 请猛击这里 3.下载Android SDK,请猛击这里,Android SDK的网页 4.下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页 5.下载ffmpeg,可以下载压缩包,也可以git一个snapshot 好了,有必要说明一下Android SDK和Android NDK SDK的区别: Android SDK

STLport-5.2.1 STL port配置; cl.exe 编译cpp:ms和cygwin两种模式;cygwin环境配置和使用、GCC编译入门

1.在ms中要使用windows sdk和相关的lib设置实在太麻烦啦,以及dll等文件缺失是在严重.所以我简单地利用了vs安装目录下的批处理文件,在命令窗口中进入: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC ,直接运行vcvarsall.bat加载vs中以及配置好的环境,就可以使用命令行: cl -GX hello.cpp去实现编译并运行.2012版本的vs中-GX换成-EHsc.同理我也可以使用vs2013.目前vs2013

Windows环境下使用Cmake ndk编译fdk-aac

 一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,下面是x264,网上说的很多都是几百年前的,我亲测完美可用 还是那句话 我能力有限,但是我希望我写的东西能够让更多的人能够接受.我也是刚刚接触.做一个记录,也希望能够对其他人有好处.联系我可以直接评论,也可以加我QQ:11635423  二.干货  准备:1.fdk_aac的源码  git clone https://android.googlesource.com/platform/external/aa

Cygwin环境使用第三方ARMGCC编译eCos系统

第三方ARMGCC通常是基于Mingw32的,使用的是Windows路径,如C:\ecos\packages\infra\current\src\startup.cxx:而eCos配置工具生成的Makefile是基于Cygwin的,使用的是POSIX路径,如/cygdrive/c/packages/infra/current/src/startup.cxx.路径格式上的差别导致不能直接使用第三方ARMGCC编译eCos系统,而是需要一个中间程序来对路径进行转换.这里提供了执行路径转换的中间程序的

在linux环境编译boost

1.在boost官网:http://www.boost.org/下载相应版本的boost 2.解压boost到相应目录,在boost跟目录下有b2可执行程序,可以通过输入命令“/b2 --help”,查看相应的参数设置. 例如: --build-dir= <builddir> 编译的临时文件会放在builddir里(这样比较好管理,编译完就可以把它删除了) --stagedir= <stagedir> 存放编译后库文件的路径,默认是stage --build-type= compl

android 纯ndk编译环境搭建

android编译c代码和其它不同,因为用的是ndk编译它固定只认jni目录,创建其它目录时编译不了.同时要用ndk编译器,如图所示:必须是jni目录,如图所示:它就会在jni同目录下生成运行文件和库文件(这个决定于mk文件),同时也可以在jni上层编译反正就是只找jni目录,如图:上面这些都是要基于一个makefile文件,在android中是android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE