记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录

  • 一些交叉编译的配置环境思路分享:
  • P:php
    • 编译PHP可能遇到的问题
      • configure阶段:
      • Makefile-make阶段:
      • Makefile-make install阶段:
  • N:Nginx

文章比较水,并没有没解决什么实际问题,有点不好意思发布。但好像又记录了不少交叉编译配置的思路,所以还是记录下来,希望有更多大佬能给支支招,共同进步!

一些交叉编译的配置环境思路分享:

想指明第三方库所在路径,有四种方法:,

  • 1,添加xx.pc文件路径export PKG_CONFIG_PATH=/xxx:$PKG_CONFIG_PATH
    指定搜索路径export LD_LIBRARY_PATH=/yourdir/:$LD_LIBRARY_PATH
  • 2,在 /etc/ld.so.conf 文件中添加库的搜索路径。将库文件的绝对路径/lib直接写进去就OK。
  • 3,丢到编译器的默认搜索路径。使用 arm-前缀-gcc -print-file-name=libpthread.so 来找到编译器的默认路径
  • 4,在configure阶段,添加-LDFLAG 增加编译选项给编译器直接增加搜索路径

一篇文章看懂上述部分名词和工具的释义

P:php

这里我用的是php7-2.15 点击官网下载其他版本
由于我这里需要用到许多库libxml、iconv、curl、gd、gmp…,然后网上暂时没找到嵌入式linux版本的一键环境安装…所以只能硬着头皮一个个去交叉编译再包含进configure里。
我的流程是这样的:
根据需要的库,去点我点我官方文档里面搜索对应的库,
在这里插入图片描述

在这里插入图片描述
然后点开安装 或者需求 ,一般都会给对应库的下载路径(爱了爱了!省去多少找源码的麻烦!)
在这里插入图片描述

下载了源码之后,就好办了,我用的是笨方法,一个个写脚本configure交叉编译
比如libxml 的交叉编译:

#!/bin/bash  
./configure  \
--prefix=$PWD/1_libxml2-dom_install \
--host=arm-himix200-linux \
--with-tree \
--with-python=$PWD/python \
CC=arm-himix200-linux-gcc \
CPP=arm-himix200-linux-cpp \

编译PHP可能遇到的问题

编译PHP可能会遇到很多麻烦,首先先看config.log 日志查找原因。由于我这里库太多,全部记录上不太现实,我慢慢记录遇到的比较有代表性的问题吧。

configure阶段:

1:找不到编译好了的依赖库。
在移植libgd库的时候,因为它需要libjpeg、libpng、libzlib等依赖前置库,所以先编译它们仨。然后在配置的脚本里–with-jpeg 的时候,总是提醒说找不到库。
后面configure的配置日志,看到了解决方法
在这里插入图片描述
很明显,configure脚本没能找到我提供的交叉编译好的库,只能手动给环境变量PKG_CONFIG_PATH 添加我libjpeg、libpng、libzlib这些库的lib/pkgconfig/xxx.pc ,这个.pc 文件指明了对应库的头文件和lib库文件存在的路径。
既然只用这一次,那就用作临时环境变量就行:

#!/bin/bash  
export PKG_CONFIG_PATH=/home/ouser/himix200-disk/php_nginx/src_tmp/zlib-1.2.11/1_zlib_install/lib/pkgconfig/:$PKG_CONFIG_PATH 
export PKG_CONFIG_PATH=/home/ouser/himix200-disk/php_nginx/src_tmp/jpeg-9d/1-jpeg/lib/pkgconfig/:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=$PWD/freetype-2.10.1/1-TARGET/lib/pkgconfig/:$PKG_CONFIG_PATH 
export PKG_CONFIG_PATH=/home/ouser/himix200-disk/php_nginx/src_tmp/libpng-1.6.37/1-TARGET/lib/pkgconfig/:$PKG_CONFIG_PATH
echo $PKG_CONFIG_PATH./configure  \
--prefix=$PWD/1-libgd \
--host=arm-himix200-linux  \
--with-config-file-path=/disk/php-7.2.15-arm/lib/ \  设置php.ini文件路径,最好是你开发板上的目录,因为这个选项编译后无法更改
--with-config-file-scan-dir=/disk/php-7.2.15-arm/lib/ \
--without-fontconfig \
--with-zlib \
--with-jpeg \
--with-freetype \
--with-png \
CC=arm-himix200-linux-gcc \

再次运行脚本,就能找到前置依赖库并编译成功啦!

如果还是不行(应该是交叉编译的ld工具查找不到对应库),
这个时候就只能在配置脚本xxx.sh里的./configure里面增加一行 LDFLAGS=-L<dir> 意思是在调用编译的时候直接指定包含的库的路径。

如果这样也是不行,就查看这个依赖库/lib/下面有没有.so ,有种情况是Makefile没有成指向有效库文件的.so 软连接,用;ln -s 源文件 目标文件 即可。
2,configure可能存在的测试语句
在这里插入图片描述
坑爹,改它,修改之前要记得备份喔!
在这里插入图片描述
3,移植进开发板后,发现找不到php.ini 文件
如果没有指定,初始php.ini在源码目录里,且有两个,一个是生产环境,一个是产品环境如php-development.ini 。在源码目录下用find ./ -name "php*.ini"一般就可以找到。

在桌面linux可以直接放到默认目录/usr/local/php下。但是咱这是交叉编译。 移植完后,想给php指定php.ini文件路径的方法我暂时还没找到,只能返回到configure阶段,用--with-config-file-path=DIR \ --with-config-file-scan-dir=DIR \两个选项来提前指定搜索路径。这个路径是你要把php.ini放在开发板的哪个位置。等make install完成后,就把php.ini放到开发板对应目录即可。
在这里插入图片描述
在这里插入图片描述
这样就可以找到了。如果全部显示(none),就代表你应该向我上面那样重新编译一遍了。


Makefile-make阶段:

1:指明了头文件包含目录为交叉编译器包含的目录,但是在make过程中总是去到/usr/include/stdlib.h
如果你能在你的交叉编译工具里找到stdlib.h,然后make过程中又提示说/usr/include/stdlib.h err: #include <bits/floatn.h> no such file ,意思是在/usr/include/stdlib.h找不到那个头文件。可是明明在configure步骤里指明了是交叉编译,却又跑去找/usr/inlcude? 既然是make阶段出问题,得勒,去找编译脚本Makefile修改:

要修改Makefile --/usr/include  全部换成交叉编译下的 .../xxx/usr/include
如:CFLAGS_CLEAN : -I/usr/include -g -O2 -fvisibility=hidden -DZEND_SIGNALS   
路径包含改为-I/opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/include 
如果你像我一样configure里包含了curl库,则另外需要
107修改 -INCLUDES =里修改curl包含的路径(别复制,这是我的路径,仅供参考):
INCLUDES = -I/home/ouser/himix200-disk/php_nginx/php-7.2.15/ext/date/lib -I/home/ouser/himix200-disk/php_nginx/src_tmp/libxml2-2.9.10/1_libxml2-dom_install/include/libxml2 -I/home/ouser/himix200-disk/php_nginx/src_tmp/openssl-1.1.1j/1_ssl_install/include -I/home/ouser/himix200-disk/php_nginx/src_tmp/zlib-1.2.11/1_zlib_install/include -I/home/ouser/himix200-disk/php_nginx/src_tmp/curl-7.75.0/1_curl_install/include -I/home/ouser/himix200-disk/php_nginx/php-7.2.15/ext/sqlite3/libsqlite -I$(top_builddir)/TSRM -I$(top_builddir)/Zend

libtool脚本修改:

# LTCC compiler flags. 88行 路径更改(别复制,这是我的路径,仅供参考)
改前:LTCFLAGS="-I/usr/include -g -O2 -fvisibility=hidden -DZEND_SIGNALS"
改后:LTCFLAGS="-I/opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/include -g -O2 -fvisibility=hidden -DZEND_SIGNALS"

这样愉快的make了几分钟,之后又报错,说需要生成的某某.lo文件找不到某某.h 头文件
在这里插入图片描述

这个简单,直接根据目标 某某.lo 在Makeflie里找到对应段,增加头文件搜索路径 -I/opt/xxx/ttt 文件路径。感觉好像是因为我修改了的configure,导致生成的Makefile总是有各种各样的小问题,还是说官方没有做过arm-linux移植适配?

2:./main/php_config.h 提示说 #define uint unsigned int 重复定义
具体的图片我没有截到,总之就是提醒在这个文件里,#define uint unsigned int等等的定义错误,搜翻译和百度才知道是说重复定义了,所以把这个文件里的这类定义注销掉。


Makefile-make install阶段:

提示无法执行的文件格式
在这里插入图片描述
可能是我在configure原文件里,把函数测试的那几句话给去掉了,所以导致现在install阶段,它居然想去执行开发板端的文件,那肯定不行啊,我的文件都用交叉编译的,肯定不能在桌面Ubuntu执行,怎么处理呢?没办法。只能手动去开发板执行这条Makeflie语句
在这里插入图片描述
完事了就在Makefile里注释掉对应语句—‘’我都帮你执行了,你就不用帮我执行了‘’
拜拜了您勒


最后,搞定php
在这里插入图片描述
附上一点小测试php代码,这是测试php::openssl库的加密解密功能的(官网抄的):

<?php
//$key previously generated safely, ie: openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
echo "decrypt:";
echo $ciphertext."\n";//decrypt later....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{echo $original_plaintext."\n";
}
echo $original_plaintext."2\n";var_dump(php_ini_loaded_file());  //获取当前加载php.ini配置文件路径var_dump(php_ini_scanned_files()); //如果有另外在加载别的php.ini文件会输出相应的信息,否则输出falseif(!extension_loaded('curl'))
{echo '请在php.ini中设置支持php_mysql.dll'."\n";
}
else
{echo '您的环境已经支持mysql!'."\n";
}
// 这句话可以打印对应拓展库所能提供的函数,可以用来测试库是否移植成功
print_r(get_extension_funcs("gd")); if (function_exists('imagejpeg')) {
echo "IMAP functions are available.<br />\n";
} else {
echo "IMAP functions are not available.<br />\n";
}
?>

N:Nginx

Nginx全版本
要交叉编译这个服务器,需要前置pcre, 点击去官网
根据官网讲述,常用且稳定的是pcre,虽然版本比较旧,但是用的非常广。pcre2是最新的。
这里我下载的是pcre-8.44
这个Nginx的移植比较有意思,它不像其他库,其他库如果要拓展,只需提供编译好的拓展库路径(包含/bin /lib /include 那个),而Nginx,则需要提供源码,它来给我们编译。
在这里插入图片描述

这就导致它对交叉编译不友好,这里附上他人例程供参考。下面记录是我遇到的问题以及解决方法
作者:爱是恒久忍耐_又有恩慈

找不到pcre2.h
在这里插入图片描述
这个简单,根据对应行号和语句,找到Makefile文件里对应的行,添加指定的头文件路径即可。如果可以事先指定CFLAG增加头文件搜索路径,也可以。

ipv6支持问题
跟上面引用的博客一样,但是原作者似乎没遇到我这个问题,我这里的ngx_event_udp.c里面有其他语句需要注释掉。既然选择不用ipv6,那就贯彻到底了。108和220行
在这里插入图片描述

相信编译完成后,肯定会遇到和我一样的问题:
在这里插入图片描述
路径又指向了桌面虚拟机的Ubuntu路径,不是开发板的路径。头疼中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面向对象的继承Shape

* - Shape基类 拥有draw()和erase()两个方法 * - 基于Shape类创建Circle子类 * - 基于Shape类创建Square子类 * - 创建Shape类创建Triangle子类 * - 创建随机形状发生的类(不是子类) * - 定义公共类(测试类),创建Shape类的数组对象长度为10&#xff0c;并为对象数组赋值其内容C…

二维码门楼牌管理应用平台建设:助力场所整改与消防安全

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化&#xff0c;二维码门楼牌管理应用平台的建设成为了提…

el-table 遇到的问题一

点击按钮一&#xff0c;出现table1 点击按钮二&#xff0c;出现table2 刚开始很简单&#xff0c;就用简单的 v-if 添加&#xff0c;但是会出现问题&#xff0c;就是点击按钮一&#xff0c;会出现table1&#xff0c;点击按钮二&#xff0c;会出现table2&#xff0c;再点击按钮…

C++ - STL详解(七)— stack和queue的介绍及使用

目录 一. stack 1.1 stack的介绍 1.2 stack的定义 1.3 stack的使用 ​编辑 二. queue 2.1 queue的介绍 2.2 queue的定义 2.3 queue的使用 一. stack 1.1 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

Java中的消息队列(如RabbitMQ、Kafka)是如何工作的

Java中的消息队列&#xff08;Message Queue&#xff09;是一种用于应用程序之间或应用程序组件之间进行异步通信的机制。消息队列允许发送者&#xff08;生产者&#xff09;将消息发送到队列中&#xff0c;而接收者&#xff08;消费者&#xff09;可以从队列中读取并处理这些消…

代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和、113. 路径总和ii

代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和、113. 路径总和ii 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 513.找树左下角的值 链接: 112. 路径总和&#xff0c;和 113. 路径总和ii 链接: 从中序与后序遍历序…

Debezium系列之:部署Debezium采集Oracle数据库的详细步骤

Debezium系列之:部署Debezium采集Oracle数据库的详细步骤 一、部署Debezium Oracle连接器二、Debezium Oracle 连接器配置三、添加连接器配置四、可插拔数据库与不可插拔数据库一、部署Debezium Oracle连接器 部署的详细步骤可以参考博主这篇技术文章: Debezium系列之:安装…

怎么用3ds MAX制作蜂窝状模型?

1、新建多边形&#xff1a;打开3ds MAX软件&#xff0c;在样条线中新建一个多边形。 2、设置参数&#xff1a;切换到顶视图&#xff0c;设置多边形的参数&#xff0c;例如半径为10&#xff0c;变数为6&#xff0c;以形成一个六边形的基础。 3、复制并形成圆柱状&#xff1a;打开…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时&#xff0c;日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态&#xff0c;定位问题&#xff0c;以及优化性能。下面&a…

深入Git配置

git配置 git config -h usage: git config [<options>]Config file location--global use global config file--system use system config file--local use repository config file--worktree use per-worktree con…

【Java】如何获取客户端IP地址

在项目中往往涉及到“获取客户端IP地址”&#xff0c;常见到下面这样子的代码&#xff1a; package com.utils;import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.reactive.ServerHttpRequest; import java.net…

逻辑运算符

一 介绍 用于连接多个条件&#xff08; 多个关系表达式&#xff09; &#xff0c; 最终的结果也是一个 boolean 值。 &&#xff1a;逻辑与&&&#xff1a;短路与|&#xff1a;逻辑或||&#xff1a;短路或&#xff01; 取反^&#xff1a;异或 二 逻辑运算规则 a&a…

K210基础实验——独立按键中断

前言 学习K210开发板的独立按键和中断功能 一、涉及到的外设资源是K210开发板上的BOOT按键和RGB灯 二、BOOT按键按下&#xff0c;MCU上连接BOOT的IO口变为低电平&#xff0c;松开后为高电平 三、引脚对应关系 BOOT : IO16 RGB灯&#xff1a; R:IO6 G:IO7 B:IO8 四、在…

【linux】多路径|Multipath I/O 技术

目录 简略 详细 什么是多路径? Multipath安装与使用 安装 使用 Linux下multipath软件介绍 附录 配置文件说明 其他解 简略 略 详细 什么是多路径? 普通的电脑主机都是一个硬盘挂接到一个总线上&#xff0c;这里是一对一的关系。 而到了分布式环境&#xff0c;主机和存储网络连…

NLP(5)-softmax和交叉熵

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 感觉全连接层就像一个中间层转换数据的形态的,或者说预处理数据&#xff1f; 代码 softmax就是把输出的y 归一化&#xff0c;把结果转化为概率值&#xff01;&#xff0c;在分类问题中很常见。 而交叉熵是一种损失函数&…

UDP协议深度解析:从原理到应用全面剖析

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 随着互联网的蓬勃发展&#xff0c;网络通信协议成为了支撑其稳定运行的关键。UDP协议作为网络通信协议中的重要一员&…

华为ensp中rip和ospf路由重分发 原理及配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月20日20点21分 路由重分发&#xff08;Route Redistribution&#xff09;是指路由器将从一种路由协议学习到的路由信息&#xff0c;通过另一种路由协议通告出去的功…

现货白银保证金交易要先分析趋势

现货白银是保证金交易品种&#xff0c;买卖过程中可能会涉及数十倍的资金杠杆&#xff0c;所以它对投资者的分析水平和交易水平的要求都比较高&#xff0c;所以在进入这个市场之前&#xff0c;投资者需要先学习一些基本的分析方法&#xff0c;当中可以分为基本面和技术面两大流…

每日一坑(pymongo版本从3.*升到4.*)

今天在做代码优化的时候发现pymongo版本不同会出现问题&#xff0c;正常3.*能跑的代码&#xff0c;一旦使用4.2或者4.3版本&#xff08;其他版本没有试&#xff0c;但应该也有问题&#xff09;就会出现 ServerSelectionTimeoutError问题&#xff0c;最后到官网找到了问题所在&a…

C++智能指针(二十)

一.RAII&#xff08;Resource Acquisition Is Initialization&#xff09; RAII资源获取即初始化&#xff0c;RAII的思想就是在构造时初始化资源&#xff0c;或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值&#xff0c;并且提供若干的资源访问的方法。比…