由于新版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)中的编译命令,直到编译完成;