详细步骤可以参考https://www.crifan.com/summary_cross_compile_library_note/
关键点:编译过程最重要的一步是,在执行
./configure ...
命令去配置程序时,将以下参数设置好:
- prefix:指的是,将编译好的库,安装到哪里
- build=i686-pc-cygwin:指的是,我当前的pc编译环境是cygwin
- target=arm-xscale-linux和–host=arm-xscale-linux:表示我的编译是交叉编译,即编译出来的代码,是运行在xscale上的。
- disable-cplusplus:表示是去禁止cpp的编译->不会去编译src/cpp下面的东西->不会出现上面的"XmlRpcCpp.cpp:39: undefined reference to `_xmlrpc_env_init’"错误
- CC=arm-xscale-linux-gnueabi-gcc:指定所用的交叉编译器gcc
参数的值根据你的具体情况去填,配置完成后,调用最后的make命令,会调用你的交叉编译器,来编译生成对应平台的可执行文件,然后把该文件拷贝过去试一试吧
小技巧:
在写脚本时,对于一些随程序不同而不同的内容建议使用宏或者说变量来代替,
用法很简单,举例说明:
filename=test
AM_INIT_AUTOMAKE(${filename}, 1.0)
这里我定义了一个变量叫filename,给他赋值为test,这个值是可以改变的,而使用这个变量通过$(变量名)的方式来使用,这个符号会把它所在的地方直接用变量名的值来替换
这么做的好处就是,你的脚本文件可以做成一个通用的模板,在一些关键位置,赋值使用你的宏定义的变量,实际使用时,只需要改变这个变量的值,就可以了
一开始只有.c或.cpp的源码,怎么从无到有生成configure和makefile文件
- 使用autoscan命令,生成configure.scan
- 将configure.scan该名为configure.ac并修改其内容,可参考https://www.cnblogs.com/fallenmoon/p/7506035.html,我只说一下几个关键的:
AC_INIT() #括号中内容填写你的主函数所在的文件名 AM_INIT_AUTOMAKE(name,1.0) #name表示你生成的程序的名字,1.0是版本号
- 执行aclocal和autoconf命令,生成aclocal.m4和configure文件
- 新建Makefile.am文件,填入以下内容:
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=${filename} #${filename}是程序的名字 helloworld_SOURCES=main.c #main.c表示主函数所在文件 ${filename}_SOURCES=... #填写你所有需要编译的文件,以空格分隔 CFLAGS += -D<name=value> #使用-D 来添加加预处理器定义 CFLAGS += -lm #大概的意思是使编译器自动去找文件引用的头文件
- 执行 automake --add-missing 生成makefile.in文件
- 执行 configure ... 配置并生成makefile文件,参数填写见上文
- 执行make