由于新版Alljoyn支持C++11特性,而C++11至少需要GCC版本在4.8以上,所以如果GCC版本低于4.8,那么在编译的时候就会报很多错误,
所以下面针对低于4.8和大于等于4.8版本进行简单介绍。

 

一、工具准备(Root权限):

1.python安装

1).检查是否安装python:

  #python -V

2).如果不存在,那么先安装python,下载地址:http://www.python.org/download/;

3).解压

  #tar -xzf Python-2.7.3.tgz

4).配置生成Makefile,在Python-2.7.3根目录下:

  #./configure

5).编译安装

  #make && make install

6).查看python版本号

  #python -V

7).如果出现下面信息:

  Python 2.7.3

  则表示python安装成功;

2.scons安装

1).下载scons,地址:http://scons.org/pages/download.html;

2).解压

  #tar -xzf scons-2.5.1.tar.gz

3).安装

  #python setup.py install

4).检查安装成功结果:

  #scons -version

如果出现下面信息:

  SCons by Steven Knight et al.:

  script: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog

  engine: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog

  engine path: ['/usr/lib/scons-2.5.1/SCons']

  Copyright (c) 2001 - 2016 The SCons Foundation

则表示scons安装成功;

 

二、GCC4.8及以上

1.下载alljoyn,地址:https://allseenalliance.org/framework/download,注意下载Standard Core Source;

2.解压

  #tar -xzf alljoyn-15.09.00a-src.tar.gz

3.GCC编译:

1).命令如下:

  #scons OS=linux CPU=x86_64 VARIANT=debug WS=off BINDINGS=cpp

  其中CPU选项根据需要选择,可选为X86,x86_64;

  VARIANT可选为debug,release;

  BINDINGS可选为C,CPP,JAVA;

2).如果出现openssl/ssl.h没有发现,那么先要安装openssl,具体怎么安装,可百度;

3).生成的库文件在build层及目录中的cpp/lib下,包含liballjoynrouter.a,liballjoyn.a,liballjoyn.so等,一般需要就这3个库;

 

4.交叉编译

1).命令如下:

  #scons OS=linux CPU=arm VARIANT=debug WS=off BINDINGS=cpp CROSS_COMPILE=/home/hechuan/workspace/Tools/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gnueabi-

CROSS_COMPILE为交叉编译工具链的绝对路径,需要到指定的工具前缀;

2).其它同上GCC;

 

三、GCC4.8以下

1).修改build_core/conf/linux/SConsript文件:

  if not config.CheckCXXFlag('-std=c++0x')://原本为-std=c++11;

  if not config.CheckCXXFlag('-std=c++0x'):

  print '*** Compiler too old to build AllJoyn. Aborting.'

  Exit(1)

 

2).编译,输入命令:

  #scons OS=linux CPU=arm VARIANT=debug WS=off BINDINGS=cpp CROSS_COMPILE=/home/hechuan/workspace/Tools/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gnueabi-

 

3).出现下列错误:

  alljoyn_c/src/BusAttachment.cc:456: error: 'nullptr' was not declared in this scope

  解决方法:找到alljoyn_c/src/http://BusAttachment.cc,打开将nullptr改为NULL,后面出现类似错误都这么修改即可;

  原因是:nullptr是C++11引入的新特性,解决C和C++中NULL的定义不一致所带来的编译器兼容问题,C中NULL是指向0地址的指针(void *)0,c++中则是定义为整数0。

 

4).继续输入2)中的编译命令,出现下列错误:

  void BusAttachment::Internal::GetConnectedPeers(一大堆);‘:’befor initialized什么什么的;

  QStatus BusAttachment::SecureConnectionInternal(一大堆);‘:’befor initialized什么什么的;
  解决方法:将:
  for(auto it = sessions[i].begin();it!=sessions[i].end();++it)

  {
    names.insert(sessionMember.second.otherParticipants.begin(), sessionMember.otherParticipants.end());

  }

  修改为:(另一处同理)

  for(auto it = sessions[i].begin();it!=sessions[i].end();++it)

  {
    names.insert(it->second.otherParticipants.begin(), it->second.otherParticipants.end());
  }

  原因:在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型,各种作用域内声明变量都可以用到它。而在C++11之前,不支持第一种格式的写法。

 

5).继续输入2)中的编译命令,出现下列错误:

  sys/capability.h no such file directory.

  解决方法:将gcc4.6.3中的/sys/capability.h文件拷贝到sys/下即可

 

6).继续输入2)中的编译命令,出现下列错误:

  /usr/bin/ld: cannot find -lcap

  解决方法:下载libcap并用和alljoyn一样的交叉编译工具编译,将生成的libcap.a,libcap.so,libcap.so.2,libcap.so.2.25拷贝到交叉编译工具链的usr/lib目录下;

  原因:交叉编译工具链中没有libcap库;

 

7).继续输入2)中的编译命令,出现下列错误:

  "dlopen","dlerror"等undefined reference.

  解决办法:打开build_core/conf/linux/SConscript文件,将下面一行:

  env.AppendUnique(LIBS =['rt', 'stdc++', 'pthread', 'm'])

  修改为:

  env.AppendUnique(LIBS =['rt', 'stdc++', 'pthread', 'm','dl'])

8).继续输入2)中的编译命令,直到编译完成;