openwrt编译bluez工具gatttool

来源:互联网 发布:c语言双引号作用 编辑:程序博客网 时间:2024/05/18 02:06

        bluez-4.101编译成功之后发现gatttool工具并没有生成,进入bluez-4.101目录运行configure看是不是有使能编译gatttool的参数,发现了--enable-gatt和--enable-tools两个相关的参数,于是修改package/bluez-libs/Makefile:

        CONFIGURE_ARGS += \                --enable-shared \                --enable-static \                --enable-gatt \                --enable-tools \

        加入后面两行,编译,还是没有生成gatttool,纳闷了,怎么回事?查看整个编译过程的输出信息,确实没有编译gatttool。

        进入代码目录,gatttool.c文件是放在attrib目录下,grep一下看看它的文件名在哪里被使用到了,发现Makefile.tools内容有如下代码

if READLINEbin_PROGRAMS += attrib/gatttoolattrib_gatttool_SOURCES = attrib/gatttool.c attrib/att.c attrib/gatt.c \attrib/gattrib.c btio/btio.c \attrib/gatttool.h attrib/interactive.c \attrib/utils.c src/log.cattrib_gatttool_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@ @READLINE_LIBS@endif

         就是说只有READLINE为TURE时gatttool才会被编译,但是READLINE怎么才能为TRUE呢?继续追查,在configure文件里面有一个readline_found变量,只有当这个值为YES,READLINE才会等于TRUE,在网上查了一下,readline其实是一个库,gatttool依赖于它,就是说configure的时候没有发现有readline这个库,所以gatttool没有被编译,那还不简单,重新menuconfig一下openwrt把readline库给选上不就行了嘛。

        可是高兴得太早了,gatttool还是没有被编译出来,都快要疯掉了!查看config.log,又发现了一些蛛丝马迹:

configure:12801: checking for main in -lreadlineconfigure:12820: mips-openwrt-linux-uclibc-gcc -o conftest -Os -pipe -mips32r2 -mtune=mips32r2 -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -msoft-float -fpic  -I/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/include -I/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/include -I/home/luotong/working/openwrt/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/usr/include -I/home/luotong/working/openwrt/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/include  -L/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib -L/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/lib -L/home/luotong/working/openwrt/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/usr/lib -L/home/luotong/working/openwrt/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib  conftest.c -lreadline   >&5/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tgetnum'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tgoto'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tgetflag'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `BC'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tputs'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `PC'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tgetent'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `UP'/home/luotong/working/openwrt/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib/libreadline.so: undefined reference to `tgetstr'collect2: ld returned 1 exit statusconfigure:12820: $? = 1configure: failed program was:
        configure在检查有没有readline库的时候,会尝试去编译一个文件,这个文件需要链接readline库,如果链接失败,那么就当作没有找到readline库,上面有好几个函数没有找到,这些函数是干嘛的呢?网上一查,是ncurses库提供的函数,那就真相大白啦,gatttool依赖于readline,而readline又依赖于ncurses,没有ncurses库的话gatttool当然编译不出来了,那就把libncurses选上吧,但是还有一个问题,configure在检查readline库的时候怎么才能指定去连接ncurses库呢?

        问一下万能的google吧,方法总是有滴,需要修改acinclude.m4文件,最好的办法是生成补丁放在bluez-libs/patchs/目录下面

--- bluez-4.101/acinclude.m4    2012-06-23 00:36:49.000000000 +0800+++ bluez-4.101.fixup/acinclude.m4      2014-07-24 21:46:00.333620281 +0800@@ -146,12 +146,15 @@ ])  AC_DEFUN([AC_PATH_READLINE], [+       LDFLAGS_BAK="$LDFLAGS"+       LDFLAGS="$LDFLAGS -lncurses"        AC_CHECK_HEADER(readline/readline.h,                AC_CHECK_LIB(readline, main,                        [ readline_found=yes-                       AC_SUBST(READLINE_LIBS, "-lreadline")+                       AC_SUBST(READLINE_LIBS, "-lreadline -lncurses")                        ], readline_found=no),                [])+       LDFLAGS="$LDFLAGS_BAK" ])  AC_DEFUN([AC_PATH_CHECK], [
         重新编译,Oh Yeah!!!,终于在attrib目录下看到gatttool可执行文件了。

         拷贝到板子上运行的时候还需要把相关的库也拷贝进去(glib,readline, ncurses等)。


         

0 0