基于buildroot框架进行的交叉编译,首先拷贝官网buildroot包,然后拷贝里面的nginx的脚本配置。然后运行make nginx
。
以下是前段时间编译nginx遇到的一些问题:
1. checking for C compiler … found but is not workong
这个主要是测试C编译器的, 在编译机器上肯定不能执行。 我们修改一下auto/cc/name
下的配置,设置ngx_feature_run=no。
2. can not detect int size
原因跟1一样, 直接修改auto/types/sizeof
设置ngx_size=4
3. checking for PCRE library … not found
依赖PCRE, 需要首先编译PCRE, 在make menuconfig 选择pcre。 如果没有,需要拷贝pcre相关的脚本 进行编译。
4. the HTTP XSLT module requires the libxml2/libxslt
同理,需要编译libxslt
5. Could not find libxml2 anywhere, check ftp://xmlsoft.org/
这个是由于我执行了make clean, host下依赖包都卸载了, 需要重新编译libxml2
6. checking for GD library …objs/autotest.c:4:10: fatal error: gd.h: No such file or directory
需要编译gd
7. checking for GeoIP library …objs/autotest.c:4:10: fatal error: GeoIP.h: No such file or directory
需要编译geoip
8. xxx-gcc: Error: unsafe header/library path use in cross-compilation: ‘-I’ ‘/usr/include/libxml2’
在添加头文件的目录时, 在目录前面添加${STAGING_DIR}
9. src/core/ngx_spinlock.c:47:2: error: #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
需要编译libatomic_ops。 修改auto/lib/conf
run=no
10. src/os/unix/ngx_errno.c:37:31: error: ‘NGX_SYS_NERR’ undeclared(first use in this function); did you mean ‘NGX_LOG_ERR’?
出错的原因仍然是因为交叉编译程序无法本地运行,手动在auto/linux
下增加
1 | if [$ngx_found = no]; then |
具体的值可以看一下errno.h的宏
11. undefined reference to gdImageCreateFromJpegPtr
gd版本升级 2.2.5 –> 2.3.0
12. /usr/bin/install: cannot stat package/nginx/nginx.logrotate
: No such file or directory
这个是目录错误了, 修改ngxin.mk。 相关package/xxx
修改为$(BR2_EXTERNAL_PATH)/package/xxx
OK, 差不多就是这些问题, 然后就编译出了nginx包了。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。