zoukankan      html  css  js  c++  java
  • 全志TinaLinux编译错误fatal error: unicode/ucnv.h: No such file or directory

    今天开始正式干活了

    拿到一个全志Tina的板子还有一个SDK压缩包,要求我这周(只剩一天半。。。)就要把sdk编译通过并且把板子跑起来。

    还特别跟我说他们试了下这个sdk编译没法通过,会报错。。。

    竟然是有坑!

    ————————————————————————————————————————————————————————————————

    准备工作:

    拷贝解压SDK

    阅读Guide手册(如何配置环境,如何编译,如何烧录)

    读完了接下来正式开工

    第一步,配置编译环境。

    但是老子是ssh远程编译服务器编译,没有全向apt-install,问老大,老大说应该配好了,叫我先编译一下试试看。

    应该?好吧,先略过。

    第二步,编译

    还好编译的时候回自动检测编译环境是否配置ok。

    按照手册开始一步一步编译,问了下公司的服务器只有4核,为了不影响其他人使用,在这里只能make -j4编译。

    之后就是等待结果。。同时可以去找找烧录套件准备硬件连接。

     $ tar -xvf Homlet-Tina-H2_H3
     $ cd Homlet-Tina-H2_H3
     $ source build/envsetup.sh
     $ lunch dolphin_p1-tina
     $ make –j4

    编译了大概13分钟之后就Error报错了!

    停止编译了!

    In file included from /usr/include/libxml2/libxml/parser.h:810:0,
                     from /usr/include/libxml2/libxml/globals.h:18,
                     from /usr/include/libxml2/libxml/threads.h:35,
                     from /usr/include/libxml2/libxml/xmlmemory.h:218,
                     from /usr/include/libxml2/libxml/tree.h:1307,
                     from mxmlds.c:22:/usr/include/libxml2/libxml/encoding.h:31:26: fatal error: unicode/ucnv.h: No such file or directory
    compilation terminated.
    Makefile:393: recipe for target 'mxmlds.lo' failed
    make[6]: *** [mxmlds.lo] Error 1
    make[6]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/compile_dir/target/libmgncs-1.2.0/src/datasource'
    Makefile:624: recipe for target 'install-recursive' failed
    make[5]: *** [install-recursive] Error 1
    make[5]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/compile_dir/target/libmgncs-1.2.0/src'
    Makefile:487: recipe for target 'install-recursive' failed
    make[4]: *** [install-recursive] Error 1
    make[4]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/compile_dir/target/libmgncs-1.2.0'
    Makefile:95: recipe for target '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/compile_dir/target/libmgncs-1.2.0/.built' failed
    make[3]: *** [/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/compile_dir/target/libmgncs-1.2.0/.built] Error 2
    make[3]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/package/minigui/libmgncs'
    package/Makefile:192: recipe for target 'package/minigui/libmgncs/compile' failed
    make[2]: *** [package/minigui/libmgncs/compile] Error 2
    make[2]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3'
    package/Makefile:189: recipe for target '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/staging_dir/target/stamp/.package_compile' failed
    make[1]: *** [/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/out/dolphin-p1/staging_dir/target/stamp/.package_compile] Error 2
    make[1]: Leaving directory '/home/liuxueneng/WorkCode/Homlet-Tina-H2_H3'
    Build failed - please re-run with -j1 to see the real error message
    /home/liuxueneng/WorkCode/Homlet-Tina-H2_H3/build/toplevel.mk:275: recipe for target 'world' failed
    make: *** [world] Error 1
    
    #### make failed to build some targets (12:27 (mm:ss)) ####

    看报错是在编译 libmgncs-1.2.0源码包的mxmlds.c的时候跟踪到encoding.h但是找不到被包含的头文件unicode/ucnv.h

    打开mxmlds.c看一下,含有以下几个头文件其中tree.h和parser.h都包含了encoding.h

    #include <libxml/tree.h>                                                      
    #include <libxml/xpath.h>                                                     
    #include <libxml/parser.h>  

    编译该源码包的时候指向的头文件路径是 /usr/include/libxml2/libxml/encoding.h

    看下头文件

    /*                                                                            
       2  * Summary: interface for the encoding conversion functions                   
       3  * Description: interface for the encoding conversion functions needed for    
       4  *              XML basic encoding and iconv() support.                       
       5  *                                                                            
       6  * Related specs are                                                          
       7  * rfc2044        (UTF-8 and UTF-16) F. Yergeau Alis Technologies             
       8  * [ISO-10646]    UTF-8 and UTF-16 in Annexes                                 
       9  * [ISO-8859-1]   ISO Latin-1 characters codes.                               
      10  * [UNICODE]      The Unicode Consortium, "The Unicode Standard --            
      11  *                Worldwide Character Encoding -- Version 1.0", Addison-      
      12  *                Wesley, Volume 1, 1991, Volume 2, 1992.  UTF-8 is           
      13  *                described in Unicode Technical Report #4.                   
      14  * [US-ASCII]     Coded Character Set--7-bit American Standard Code for       
      15  *                Information Interchange, ANSI X3.4-1986.                    
      16  *                                                                            
      17  * Copy: See Copyright for the status of this software.                       
      18  *                                                                            
      19  * Author: Daniel Veillard                                                    
      20  */                                                                           
      21                                                                               
      22 #ifndef __XML_CHAR_ENCODING_H__                                               
      23 #define __XML_CHAR_ENCODING_H__                                               
      24                                                                               
      25 #include <libxml/xmlversion.h>                                                
      26                                                                               
      27 #ifdef LIBXML_ICONV_ENABLED                                                   
      28 #include <iconv.h>                                                            
      29 #endif                                                                        
      30 #ifdef LIBXML_ICU_ENABLED                                                     
      31 #include <unicode/ucnv.h>                                                     
      32 #endif                                                                        
      33 #ifdef __cplusplus                                                            
      34 extern "C" {                                                                  
      35 #endif          

    发现里面有个宏 LIBXML_ICU_ENABLED开关控制unicode/ucnv.h的包含,控制ICU的功能是否需要enable。

    现在报错找不到unicode/ucnv.h说明这个宏被人定义了,但是在sdk目录下搜索LIBXML_ICU_ENABLED 关键字的文件只有两个,其中xmlversion.h明确屏蔽了这个宏

    ./package/allwinner/liballwinner_tina/liballwinner/LIBRARY/EXTERNAL/include/libxml/encoding.h
    ./package/allwinner/liballwinner_tina/liballwinner/LIBRARY/EXTERNAL/include/libxml/xmlversion.h
    /**
     * LIBXML_ICU_ENABLED:
     *
     * Whether icu support is available
     */
    #if 0
    #define LIBXML_ICU_ENABLED
    #endif

    上面两个文件和指定目录的文件是同一个类型,只是不同版本,查看指定路径头文件/usr/include/libxml2/libxml/xmlversion.h,发现里面打开了这个宏。

    /**                                                                           
     281  * LIBXML_ICU_ENABLED:                                                        
     282  *                                                                            
     283  * Whether icu support is available                                           
     284  */                                                                           
     285 #if 1                                                                         
     286 #define LIBXML_ICU_ENABLED                                                    
     287 #endif   

    原本可以在指定的头文件里屏蔽掉这个宏重新编译就可以了。

    但是这个是编译服务器的系统头文件

    首先没有权限修改。

    其次为了编译某个项目屏蔽公用的头文件功能对别人使用会有影响。

    最重要的是这个sdk编译完了要打包烧录到arm板子上,最好不要依赖牵涉宿主机上的东西,所有依赖自带并打包才更符合逻辑。

    --------------------------------------------------------------------------------------------------------------------------------------------------

    问题原因找到了,解决办法就是修改头文件指定目录。

    现在需要找到头文件路径设置的地方进而修改。

    整个sdk编译走的都是Makefile结构,头文件路径有些是从父级环境变量继承下来的,有些是子目录源码自己添加的。

    查看出问题的源码Makefile发现了CPPFLAGS里面就是包含了刚才那个系统头文件目录

     /usr/include/libxml2/libxml

    但是改这个Makefile是没有任何意义的,因为Makefile文件是configure之后自动产生的,所以这个应该问题和configure有关

    看下源码libmgncs-1.2.0目录下的configure文件(重新解压未编译过的)果然发现了里面自带的configure.as包含这个固定路径

    if test "x$build_datasource_xml" = "xyes"; then                               
         AC_DEFINE(_MGNCSDB_DATASOURCE, 1,                                         
             [Define if support datasource])                                       
         AC_DEFINE(_MGNCSDB_XML, 1,                                                
                     [Define if support xml datasource])                     
         CPPFLAGS="$CPPFLAGS -I/usr/include/libxml2"
    fi

    现在只要把这个头文件地址改到自己指定的libxml2目录就可以了

    CPPFLAGS="$CPPFLAGS -I../../../../package/allwinner/liballwinner_tina/liballwinner/LIBRARY/EXTERNAL/include/libxml"

    重新configure 编译就通过了。

     接下来就是准备烧录验证硬件了。。。

  • 相关阅读:
    RecyclerView的万能适配器+定义可以到底部自动刷新的RecyclerView
    Material Design 摘要
    模版方法模式
    工厂方法模式
    单例模式
    Android中使用Intent和IntentFilter进行通信
    Json/XML/HTML数据解析
    Java中集合总结
    重构笔记
    Android中ActionBar的使用
  • 原文地址:https://www.cnblogs.com/tid-think/p/10769656.html
Copyright © 2011-2022 走看看