Loudmouth_ARM 移植教程 (成功移植)


1.创建交叉编译环境
配置 arm-linux-gcc 交叉编译环境,测试使用 4.3.2 版本,其他版本没有测试。具体方法自
行查阅。
2.glib 库的移植
这是 loudmouth 的唯一必须依赖的库。这里选择 glib-2.24.2 版本。
由于某些 glib 库的功能在 ARM 平台上不能实现,所以需要屏蔽一些功能。在 glib 源码根
目录下建立一个配置脚本,将下列语句保存程.sh 文件,比如 my_glib_arm_config.sh
#!/bin/bash
ARCH=arm
ROOTFS_DIR=/root/workspace
CC=arm-linux-gcc
if ! [  -d ${EXPDIR} ]; then
mkdir  -p ${EXPDIR}
fi
echo ac_cv_type_long_long=yes>${ARCH}-linux.cache
echo glib_cv_stack_grows=no>>${ARCH}-linux.cache
echo glib_cv_uscore=no>>${ARCH}-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>${ARCH}-linux.cache
echo glib_cv_uscore=no>>$ARCH -linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>$ARCH -linux.cache
echo ac_cv_func_posix_getgrgid_r=yes>>$ARCH -linux.cache
make distclean
./configure  --prefix=$ROOTFS_DIR/usr  --cache-file=$ARCH -linux.cache  --build=i686-pc-
linux-gnu --target=$ARCH -linux  --host=$ARCH-linux
ROOTFS_DIR 是工作目录,最终编译好的 glib 库文件会放到 EXPDIR/usr  文件夹内,该文
件夹路径可以任意修改,之后的一些相关的参数也要跟随这个目录而做相应的改动。
然后在终端执行:
chmod 777 my_glib_arm_config.sh
./ my_glib_arm_config.sh
如果过程没问题,接下来在终端执行 make:
make
make install
3.loudmouth 库的移植
在 loudmouth 源码根目录下建立一个配置脚本,将下列语句保存程.sh 文件,比如
my_mouth_arm_config.sh
#!/bin/bash
export ROOTFS_DIR=/root/workspace
export ARCH=arm
export CC=$ARCH-linux-gcc
make distclean
./configure  --prefix=$ROOTFS_DIR/usr  --build=i686-pc-linux-gnu  --target=$ARCH -linux  --host=$ARCH-linux  --with-ssl=no "CFLAGS=-I$ROOTFS_DIR/usr/include/glib -2.0 -I$ROOTFS_DIR/usr/lib/glib -2.0/include"  "LIBS=-L$ROOTFS_DIR/usr/lib -lglib-2.0"
修改生成的 Makefile
SUBDIRS = loudmouth docs examples tests  改为
SUBDIRS = loudmouth docs
修改 bash 文件权限,并执行:
chmod 777 my_mouth_arm_config.sh
./my_mouth_arm_config.sh
如果配置过程无误,则执行 make 指令
make
make install
经过上述过程,在$ROOTFS_DIR/usr/lib 就有 ARM 平台上使用的 glib 库文件和
loudmouth 库文件了。
在使用前刚才编译好的库文件复制到开发板上。即将$ROOTFS_DIR/usr/lib 下的文件全部
复制到开发板的/lib 下,如果开发板存储空间不够,则只复制 glib*和 loudmouth*文件
4.编译 ARM 平台上的 loudmouth 应用程序
使用 pkg-config 来配置编译参数。
编译 ARM 平台上 loudmouth 应用程序的示例参考 Makefile 如下:
xmpp_test :
arm-linux-gcc  -g -o xmpp_test xmpp_test.c `pkg-config  --cflags  --libs
/root/workplace/usr/lib/pkgconfig/glib -2.0.pc  /root/workplace/usr/lib/pkgconfig/loudmouth -1.0.pc`
编译完成后可以使用 file 命令检查一下可执行文件信息。
最后将编译好的应用程序复制到开发板上运行即可(如有必要,需要修改运行权限 chmod
777 …)
5.一个使用 ARM 平台 loudmouth 库的示例程序代码(来自互联网)
#include <loudmouth/loudmouth.h>
#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <unistd.h>
static LmHandlerResult lm_message_handle(LmMessageHandler *handler,
LmConnection *conn, LmMessage *msg, gpointer data);
int main (int argc, char **argv)
{
LmConnection *conn;
GError  *error = NULL;
LmMessage *m;
LmSSL *ssl;
LmMessageHandler *msghandler;
if (argc < 6) {
g_print("Usage: test server username password recipient message");
return  -1;
}
conn =  lm_connection_new(argv[1]);
if (!lm_connection_open_and_block(conn,  &error)) {
g_print("Couldn't open connection to '%s':\n%s\ n",
argv[1], error->message);
return  -1;
}
if   (!lm_connection_authenticate_and_block(conn,  argv[2], argv[3],
"MyTestApp", &error)) {
g_print("Couldn't authenticate with '%s' '%s':\n%s\ n",
argv[2], argv[3], error->message);
return  -1;
}
msghandler = lm_message_handler_new(lm_message_handle,  NULL, NULL);
lm_connection_register_message_handler(conn,  msghandler,
LM_MESSAGE_TYPE_MESSAGE,
LM_HANDLER_PRIORITY_LAST);
m = lm_message_new(argv[4],  LM_MESSAGE_TYPE_MESSAGE);
lm_message_node_add_child(m->node,  "body", argv[5]);
if (!lm_connection_send(conn,  m, &error)) {
g_print("Error while sending message to '%s':\n%s\ n",
argv[4], error->message);
}
lm_message_unref(m);
//send presence message to server to indicate online
m=lm_message_new(NULL, LM_MESSAGE_TYPE_PRESENCE);
if (!lm_connection_send(conn,  m, &error)) {
printf("Failed  to send:%s\ n", error->message);
}
lm_message_unref(m);
g_main_loop_run(g_main_loop_new(NULL, FALSE));
lm_connection_close(conn, NULL);
lm_connection_unref(conn);
return 0;
}
static LmHandlerResult lm_message_handle(LmMessageHandler *handler,
LmConnection *conn, LmMessage *msg, gpointer data)
{
LmMessageNode *root_node = lm_message_get_node(msg);
LmMessageNode *body_node = lm_message_node_get_child(root_node,  "body");
const gchar *value;
const gchar *from = lm_message_node_get_attribute(root_node,  "from");
if (body_node)
{
value = lm_message_node_get_value(body_node);
printf("recv msg(from  \'%s\'): %s\ n", from, value);
}
return  LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值