【背景】
最近折腾了用crosstool-ng在cygwin和Ubuntu下面的:
制作交叉工具链:
【记录】重试使用最新版本1.18.0的crosstool-ng去配置和编译xscale的交叉编译器
【记录】Ubuntu下用crosstool-ng为xscale建立交叉编译器arm-xscale-linux-gnueabi-gcc
用交叉编译器去编译各种库:
【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译xmlrpc
【记录】Cygwin下用arm-xscale-linux-gnueabi-gcc交叉编译curl(libcurl)
【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译libxml2
【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译log4c
【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译expat
【记录】用交叉编译器arm-xscale-linux-gnueabi交叉编译一个基于嵌入式Linux的无线HART的项目
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译xmlrpc
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译curl(libcurl)
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译libxml2
然后对于交叉编译,有点心得,现总结如下:
交叉编译库时所最常用到的配置
由:
而知,一般编译都是:
./configure xxx
make
make install
此处,对于./configure的xxx,我最常用的是:
1 | . /configure --prefix=YOUR_INSTALL_PATH --build=CURRENT_ENV --target=CROSS_COMPILER --host=CROSS_COMPILER CC=CROSS_COMPILER-gcc OTHER_PARAMETER |
其中:
–prefix=YOUR_INSTALL_PATH
即,你所要把当前的库,在编译完毕之后,安装到哪里
举例:
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译xmlrpc
中的:
1 | . /configure --prefix= /opt/crosscompile/xmlrpc --build=i686-pc-linux-gnu --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi CC=arm-xscale-linux-gnueabi-gcc |
–build=CURRENT_ENV
目前我遇到的有两种:
- 一个是cygwin:
- –build=i686-pc-cygwin
- 举例:
- 【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译expat
- 中的:
- 一个是普通的Linux,比如Ubuntu:
- –build=i686-pc-linux-gnu
- 举例:
- 【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译curl(libcurl)
- 中的
1 | . /configure --prefix=$HOME /develop/crosstool-ng/x-tools/armxscaleexpat --build=i686-pc-cygwin --target=arm-xscale-linux --host=arm-xscale-linux CC=arm-xscale-linux-gnueabi-gcc |
1 | . /configure --prefix= /opt/crosscompile/curl --build=i686-pc-linux-gnu --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi CC=arm-xscale-linux-gnueabi-gcc -- enable -static |
关于其值的来历:
(1)其中,此build的值,我之前是参考:
【记录】crosstool为xscale编译(ct-ng build)过程
中的输出:
1 2 3 4 5 | [EXTRA] Dumping internal crosstool-NG configuration [EXTRA] Building a toolchain for : [EXTRA] build = i686-pc-cygwin [EXTRA] host = i686-pc-cygwin [EXTRA] target = arm-xscale-linux-gnueabi |
而知道的。
(2)其中,此处的build的值,也是参考:
【记录】Ubuntu下用crosstool-ng为xscale建立交叉编译器arm-xscale-linux-gnueabi-gcc
->
中的输出:
1 2 3 4 5 | [EXTRA] Dumping internal crosstool-NG configuration [EXTRA] Building a toolchain for : [EXTRA] build = i686-pc-linux-gnu [EXTRA] host = i686-pc-linux-gnu [EXTRA] target = arm-xscale-linux-gnueabi |
才知道的。
–target=CROSS_COMPILER和–host=CROSS_COMPILER
对于target和host,此处,都是设置的是交叉编译器的(前缀)。
比如,如果你的交叉编译器是arm-linux,那就是:
1 | --target=arm-linux --host=arm-linux |
我此处,用crosstool-ng编译出来的for xscale的交叉编译器是:arm-xscale-linux-gnueabi
所以,此处后续编译各种库,都是用的是:
1 | --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi |
举例:
1. 【记录】Cygwin下用arm-xscale-linux-gnueabi交叉编译log4c
中的:
1 | . /configure --prefix=$HOME /develop/crosstool-ng/x-tools/armxscalelog4c --build=i686-pc-cygwin --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi --with-expat-prefix=$HOME /develop/crosstool-ng/x-tools/armxscaleexpat CC=arm-xscale-linux-gnueabi-gcc |
2.【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译curl(libcurl)
中的:
1 | . /configure --prefix= /opt/crosscompile/curl --build=i686-pc-linux-gnu --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi CC=arm-xscale-linux-gnueabi-gcc -- enable -static |
CC=CROSS_COMPILER-gcc
1.此处的CC参数,是用于指定编译器用哪个。
一般都是对应的交叉编译器的前缀,加上gcc,比如:
arm-linux的话,加上gcc就是:arm-linux-gcc
arm-xscale-linux-gnueabi加上gcc,就是:arm-xscale-linux-gnueabi-gcc
2.而且,也多数都是可以在./configure时,就设置好对应的CC的值的。
举例:
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译curl(libcurl)
中的:
1 | . /configure --prefix= /opt/crosscompile/curl --build=i686-pc-linux-gnu --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi CC=arm-xscale-linux-gnueabi-gcc -- enable -static |
之后,直接去make即可。
但是也有例外:
【记录】cygwin下用arm-xscale-linux-gnueabi交叉编译libcgi
中,由于configure不支持设置CC,所以需要放到后面的make才行,即:
1 2 | . /configure --prefix=$HOME /develop/crosstool-ng/x-tools/libcgi --build=i686-pc-cygwin --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi make CC=arm-xscale-linux-gnueabi-gcc |
OTHER_PARAMETER
1../configure可以去添加你所需要的参数
但是一般都支持的规则是:
–enable-xxx:启用(编译)某个子模块或功能(feature)
–disable-xxx:禁止(不编译)某个子模块或功能(feature)
–with-xxx:类似于–enable-xxx
–without-xxx:类似于–disable-xxx
举例:
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译libxml2
中,经过调试错误,发现就不需要编译python,所以,可以去添加对应的
--without-python
去禁止编译python。
所用的配置就是:
1 | . /configure --prefix= /opt/crosscompile/libxml2 --build=i686-pc-linux-gnu --target=arm-xscale-linux-gnueabi --host=arm-xscale-linux-gnueabi CC=arm-xscale-linux-gnueabi-gcc --without-python |
2.添加参数之前,需要搞清楚,当前你所要去编译的库,本身支持什么参数。
正常都是可以通过:
1 | . /configure --help |
去查看到,当前模块,所支持哪些参数。
举例:
【记录】Cygwin下用arm-xscale-linux-gnueabi-gcc交叉编译curl(libcurl)
中就可以通过
1 | . /configure --help |
而看到当前的curl支持很多参数,其中包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | Optional Features: --disable-FEATURE do not include FEATURE (same as -- enable -FEATURE=no) -- enable -FEATURE[=ARG] include FEATURE [ARG= yes ] -- enable -maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer -- enable -debug Enable debug build options --disable-debug Disable debug build options -- enable -optimize Enable compiler optimizations --disable-optimize Disable compiler optimizations -- enable -warnings Enable strict compiler warnings --disable-warnings Disable strict compiler warnings --disable-dependency-tracking speeds up one- time build -- enable -dependency-tracking do not reject slow dependency extractors --disable-largefile omit support for large files -- enable -shared[=PKGS] build shared libraries [default= yes ] -- enable -static[=PKGS] build static libraries [default= yes ] -- enable -fast- install [=PKGS] optimize for fast installation [default= yes ] --disable-libtool-lock avoid locking (might break parallel builds) -- enable -http Enable HTTP support --disable-http Disable HTTP support -- enable - ftp Enable FTP support --disable- ftp Disable FTP support -- enable - file Enable FILE support --disable- file Disable FILE support -- enable -ldap Enable LDAP support --disable-ldap Disable LDAP support -- enable -ldaps Enable LDAPS support --disable-ldaps Disable LDAPS support -- enable -proxy Enable proxy support --disable-proxy Disable proxy support -- enable -dict Enable DICT support --disable-dict Disable DICT support -- enable -telnet Enable TELNET support --disable-telnet Disable TELNET support -- enable -tftp Enable TFTP support --disable-tftp Disable TFTP support -- enable -manual Enable built- in manual --disable-manual Disable built- in manual -- enable -libgcc use libgcc when linking -- enable -ipv6 Enable ipv6 (with ipv4) support --disable-ipv6 Disable ipv6 support --disable-thread don't look for thread-safe functions -- enable -thread look for thread-safe functions -- enable -nonblocking Enable non-blocking communications --disable-nonblocking Disable non-blocking communications -- enable -ares=PATH Enable c-ares for name lookups --disable-ares Disable c-ares for name lookups -- enable -verbose Enable verbose strings --disable-verbose Disable verbose strings -- enable -sspi Enable SSPI --disable-sspi Disable SSPI -- enable -crypto-auth Enable cryptographic authentication --disable-crypto-auth Disable cryptographic authentication -- enable -cookies Enable cookies support --disable-cookies Disable cookies support -- enable -hidden-symbols Hide internal symbols in library --disable-hidden-symbols Leave all symbols with default visibility in library -- enable -soname-bump Enable enforced SONAME bump --disable-soname-bump Disable enforced SONAME bump Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG= yes ] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC /non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-ldap-lib=libname Specify name of ldap lib file --with-lber-lib=libname Specify name of lber lib file --with-krb4-includes=DIR Specify location of kerberos4 headers --with-krb4-libs=DIR Specify location of kerberos4 libs --with-krb4=DIR where to look for Kerberos4 --with-spnego=DIR Specify location of SPNEGO library fbopenssl --with-gssapi-includes=DIR Specify location of GSSAPI header --with-gssapi-libs=DIR Specify location of GSSAPI libs --with-gssapi=DIR Where to look for GSSAPI --with-ssl=PATH Where to look for OpenSSL, PATH points to the SSL installation (default: /usr/local/ssl ); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option --without-ssl disable OpenSSL --with-zlib=PATH search for zlib in PATH --without-zlib disable use of zlib --with-libssh2=PATH Where to look for libssh2, PATH points to the LIBSSH2 installation (default: /usr/local/lib ); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option --without-libssh2 disable LIBSSH2 --with-egd-socket=FILE Entropy Gathering Daemon socket pathname --with-random=FILE read randomness from FILE (default= /dev/urandom ) --with-gnutls=PATH where to look for GnuTLS, PATH points to the installation root (default: /usr/local/ ) --without-gnutls disable GnuTLS detection --with-nss=PATH where to look for NSS, PATH points to the installation root (default: /usr/local/ ) --without-nss disable NSS detection --with-ca-bundle=FILE File name to use as CA bundle --without-ca-bundle Don't use a default CA bundle --with-ca-path=DIRECTORY Directory to use as CA path --without-ca-path Don't use a default CA path --with-libidn=PATH Enable libidn usage --without-libidn Disable libidn usage |
而对应的,后来经过参考别人的配置,加上了这个:
--
enable
-static
去实现对应的,支持静态库的效果。
所用配置就是:
1 | . /configure --prefix=$HOME /develop/crosstool-ng/x-tools/armxscalecurl --build=i686-pc-cygwin --host=arm-linux CC=arm-xscale-linux-gnueabi-gcc -- enable -static |
转载请注明:在路上 » 【整理】交叉编译心得和注意事项