• 如何交叉编译开源库-->编译c-ares库从失败到成功的过程[ocean]



    编译c-ares库从失败到成功的过程
    c-ares-master: apt-get install libtool   
    ####https://github.com/c-ares/c-ares

    ==============================


    失败的过程;

    {
    1.host配错了
        ./configure --host=x86_64-pokysdk-linux --target=arm-poky-linux-gnueabi --prefix=/root/work/lib_arm/c-ares
        make
        
            root@ubuntu:~/work/share/mqtt/c-ares-master# find . -name "*.so*"
            ./.libs/libcares.so.2.2.0
            ./.libs/libcares.so
            ./.libs/libcares.so.2
            root@ubuntu:~/work/share/mqtt/c-ares-master# file ./.libs/libcares.so.2.2.0
            ./.libs/libcares.so.2.2.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0e375b908f27eba4b86bd572c4716c1671b4b849, not stripped    
    
        
        
    2. arm-poky-linux-gnueabi-gcc 交叉编译工具的配置不适合代码
    ld: error: a.out uses VFP register arguments, /tmp/ccNTGLwS.o does not
    
        http://stackoverflow.com/questions/9753749/arm-compilation-error-vpf-registered-used-by-executable-not-object-file
        
        triplet indicates that your compiler is configured for the soft-float ABI.
        but part of your lib or *.o is using soft-float ABI.
        solved by exporting-mfloat-abi=hard to flags
        
        
        root@ubuntu:~/work/share/mqtt/c-ares-master# ./configure  --host=arm-poky-linux-gnueabi  --prefix=/root/work/lib_arm/c-ares
            checking whether to enable maintainer-specific portions of Makefiles... no
            checking whether make supports nested variables... yes
            checking whether to enable debug build options... no
            checking whether to enable compiler optimizer... not specified (assuming yes)
            checking whether to enable strict compiler warnings... no
            checking whether to enable compiler warnings as errors... no
            checking whether to enable curl debug memory tracking... no
            checking whether to enable hiding of library internal symbols... yes
            checking whether to expose internal static functions for testing... no
            checking for path separator... :
            checking for sed... /bin/sed
            checking for grep... /bin/grep
            checking for egrep... /bin/grep -E
            checking for arm-poky-linux-gnueabi-ar... /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar
            checking for a sed that does not truncate output... (cached) /bin/sed
            checking whether to build with code coverage support... no
            checking build system type... x86_64-pc-linux-gnu
            checking host system type... arm-poky-linux-gnueabi
            checking for a BSD-compatible install... /usr/bin/install -c
            checking for arm-poky-linux-gnueabi-gcc... arm-poky-linux-gnueabi-gcc
            checking whether the C compiler works... no
            configure: error: in '/root/work/share/mqtt/c-ares-master':
            configure: error: C compiler cannot create executables
            See 'config.log' for more details        
                
                vi config.log    
                    configure:4426: $? = 1
                    configure:4445: checking whether the C compiler works
                    configure:4467: arm-poky-linux-gnueabi-gcc    conftest.c  >&5
                    /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.9.1/
                    ld: error: a.out uses VFP register arguments, /tmp/ccNTGLwS.o does not //重点在这里
                    /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.9.1/
                    ld: failed to merge target specific data of file /tmp/ccNTGLwS.o
                    collect2: error: ld returned 1 exit status
                    configure:4471: $? = 1
                    configure:4509: result: no
                    configure: failed program was:
                    | /* confdefs.h */
                    | #define PACKAGE_NAME "c-ares"
                    | #define PACKAGE_TARNAME "c-ares"
                    | #define PACKAGE_VERSION "-"
                    | #define PACKAGE_STRING "c-ares -"
                    | #define PACKAGE_BUGREPORT "c-ares mailing list: http://cool.haxx.se/mailman/listinfo/c-ares"
                    | #define PACKAGE_URL ""
                    | #define OS "arm-poky-linux-gnueabi"
                    | /* end confdefs.h.  */
                    |
                    | int main (void)
                    | {
                    |
                    |  ;
                    |  return 0;
                    | }
                    configure:4514: error: in '/root/work/share/mqtt/c-ares-master':
                    configure:4516: error: C compiler cannot create executables
            
    
      解决办法: CFLAGS加一个-mfloat-abi=hard  
    }
    View Code



    正确步骤
    {
        cd c-ares-master/
        ./buildconf   
        export CFLAGS="-mfloat-abi=hard -g0 -O2 -Wno-system-headers "
        ./configure  --host=arm-poky-linux-gnueabi  --prefix=/root/work/lib_arm/c-ares
        make

        root@ubuntu:~/work/share/mqtt/c-ares-master# find . -name "*.so*"
        ./.libs/libcares.so.2.2.0
        ./.libs/libcares.so
        ./.libs/libcares.so.2
        root@ubuntu:~/work/share/mqtt/c-ares-master# file ./.libs/libcares.so.2.2.0
        ./.libs/libcares.so.2.2.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=c170250d2d9eae99d07a9f71face684ee50c7ef7, not stripped
    }


    开源组件的常见配置:
    {
    查看目录下面的README,INSTALL这些文档,看怎么去build。
        ./buildconf
        ./configure --host=x86_64-pokysdk-linux --target=arm-poky-linux-gnueabi --prefix=/root/work/lib_arm/c-ares

    make有时候可以手动指定CC,AR,LD等编译选项,但是要根据组件的Makefile和config文件是否用到,名字是不是这个,不能随意猜测
        make CC="arm-poky-linux-gnueabi-gcc" AR="arm-poky-linux-gnueabi-ar r" RANLIB="arm-poky-linux-gnueabi-ranlib"  
        make CC="arm-poky-linux-gnueabi-gcc" AR="arm-poky-linux-gnueabi-ar r" RANLIB="arm-poky-linux-gnueabi-ranlib" install

    有可能需要配置下某些编译选项以使得编译器配置和组件代码的要求相匹配
        export CFLAGS="-mfloat-abi=hard -g0 -O2 -Wno-system-headers "

    }

     
    参考:
    build、host和target
    http://www.cnblogs.com/electron/p/3548039.html    
    {
      我们以 gcc 为例子来 讲解 这三者的作用
      ./configure --build=编译平台 --host=运行平台 --target=目标平台 [各种编译参数]
      来配置gcc的源代码,以让其编译出我们需要的gcc编译器。

        --build:
            表示目前我们正在运行的平台名称是什么,如果当前我们是在intel的pentium机器中编译该系统,那么我们的--build就可能是 i686-pc-linux-gnu,当然如果我们在其它种类的机器上编译那么这个build就应该是那个机器所对应的平台名称。
            该参数在不指定的情况下将自动尝试猜测目前平台的名称。

        --host:
            表示我们把这个编译好的gcc在什么样的平台下运行,在交叉编译过程中这个需要我们来指定,因为机器自己是不能知道我们心里是怎么想的,那 么我们可以明确的告诉它,我们要做出来的程序是运行在“龙芯”上的,但是目前还不能直接指定“龙芯”,因此我们这里指定为mips64el- unknown-linux-gnu(如果你省点事情那么就用这个名字好了,如果你想用个有个性的名字,那么请你想明白它的含义再动手,并且做好后面的过 程需要多出一些手续的麻烦的心理准备)。
            --host也可以不指定,那么host将自动使用build来定义自己,不过那将不再是交叉编译。
            注:--build和--host在不同的时候就被配置文件认定为交叉编译方式。

        --target:
            该参数的目的是让配置程序知道这个软件被编译后使用来处理什么平台上的文件的。

        总结一下:
            build:自动测试在用平台名称,若无法检测出来则需要指定。
            host:若无指定,自动使用build的结果。
            build和host相同时表示本地编译,若不相同则表示交叉编译。
            target:表示需要处理的目标平台名称,若无指定使用host相同名称,gcc、binutils等于平台指令相关软件有此参数,多数软件此参数无用处。        
            
    }









  • 相关阅读:
    mysql报错总结
    mysql半同步开启
    BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
    BZOJ1096 [ZJOI2007]仓库建设 动态规划 斜率优化
    BZOJ3437 小P的牧场 动态规划 斜率优化
    BZOJ3156 防御准备 动态规划 斜率优化
    BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化
    BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
    BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
    树状数组的一些区间修改与区间询问的实现
  • 原文地址:https://www.cnblogs.com/mylinux/p/5950204.html
Copyright © 2020-2023  润新知