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

news2024/12/23 1:41:16

嵌入式 lnmp搭建的记录

  • N:Nginx
  • P:php
    • 编译PHP可能遇到的问题
      • configure阶段:
      • Makefile-make阶段:
      • Makefile-make install阶段:

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

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路径,不是开发板的路径。头疼中…

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 日志查找原因。由于我这里库太多,全部记录上不太现实,我慢慢记录遇到的比较有代表性的问题吧。

PPS:想指明第三方库所在路径,有四种方法:,
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=xxx.so 来找到编译器的默认路径
4,在configure阶段,添加-LDFLAG 增加编译选项给编译器直接增加搜索路径
如果你移动了lib库文件,对应的xx.pc也要同步更新,且放到pkgconfig搜索目录下!!否则pkg-config会搜索不到!

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文件会输出相应的信息,否则输出false

if(!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";
}
?>

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

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

相关文章

网工交换技术基础——VLAN原理

1、VLAN的概念&#xff1a; VLAN(Virtual LAN)&#xff0c;翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 2、VLAN的主要作用&#xf…

【网站项目】学生选课系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Pandas数据分析学习笔记

前言 开刷Pandas数据分析&#xff0c;看起来很好理解&#xff0c;不过没做笔记没敲代码心里总是不安稳&#xff0c;所以复现下课程代码并演示其中遇到的问题&#xff0c;顺便水一水笔记好了 参考资料&#xff1a; 课程视频链接&#xff1a;Pandas数据分析从入门到实战 数据…

福州复式装修,115平四室三厅现代简约风。福州中宅装饰,福州装修

设计亮点 设计理念&#xff1a; 静享时光谧境 克制的优雅&#xff0c;简约的沉淀 以光为引&#xff0c;以意为境 案例简介&#xff1a; 该方案现代风格为整个设计带来现代的舒适感&#xff0c;各种材质相互碰撞的设计&#xff0c;即保持着整齐的视感&#xff0c;又将高级气质凸…

分布式锁设计

一 分布式环境互斥实现 1 数据库锁 1.1 悲观锁 innodb行锁 共享锁&#xff08;S Lock&#xff09;:允许事务读一行数据&#xff0c;具有锁兼容性质&#xff0c;允许多个事务同时获得该锁。排它锁&#xff08;X Lock&#xff09;:允许事务删除或更新一行数据&#xff0c;具有…

ATA-300系列功率放大器全新升级

一、公司介绍 Aigtek是国产专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队&#xff0c;目前拥有数量众多的专利和…

Java | Leetcode Java题解之第32题最长的有效括号

题目&#xff1a; 题解&#xff1a; class Solution {public int longestValidParentheses(String s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s.charAt(i) () {left;} else {right;}if (left right) {maxlength Math.max(maxlen…

YOLOv9最新改进系列:融合混合注意力机制CBAM,关注通道和空间特征,助力YOLOv9新模型快速涨点!

YOLOv9最新改进系列&#xff1a;融合混合注意力机制CBAM&#xff0c;关注通道和空间特征&#xff0c;助力YOLOv9新模型快速涨点&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全文戳这里&#xff01; 详细的改进教程以及源码&#…

各大厂都推出鸿蒙APP了,你就一定要学习一下鸿蒙APP测试了!

2023年8月&#xff0c;华为推出鸿蒙4.0&#xff0c;由于其广泛的用户基础和品牌传播力&#xff0c;在短短几个月的时间&#xff0c;使用鸿蒙4.0系统的设备就达到千万级别&#xff0c;并且在9月份发售Mate 6之后&#xff0c;还在装机量的增长更加迅猛。 基于此&#xff0c;11月…

【Harmony3.1/4.0】学习笔记一

Harmong3.1/4.0是基于ArkTS编程语言的操作系统&#xff0c;本文开始将逐渐讲解和学习鸿蒙操作系统的知识。 1.线性布局(Row/Column)综合使用 线性布局结合文本控件&#xff0c;图片控件和按钮控件完成简单的鸿蒙移动应用开发界面 其ArkTS代码如下&#xff1a; Entry Compone…

Compose 简单组件

文章目录 Compose 简单组件TextText属性使用AnnotatedStringSpanStyleParagraphStyle SelectionContainer 和 DisableSelectionClickableText TextFieldTextField属性使用OutlinedTextFieldBasicTextFieldKeyboardOptions 键盘属性KeyboardActions IME动作 ButtonButton属性使用…

【超级简单】vscode进入服务器的docker容器

前提 1、已经运行docker容器 2、已经用vscode链接服务器 在vscode中安装的插件 Dev Containers docker 在容器中安装的依赖 yum install openssh-server yum install openssh-clientsvscode进入服务器的docker容器 找到自己的容器&#xff0c;右键点击&#xff0c;找到…

网络安全可以免费学习吗?

当然可以&#xff01;&#xff01;&#xff01; 这边每周都有免费的网络安全公开课&#xff01;&#xff01; 感兴趣的可以直接留言&#xff01; 会有专门的人联系的 或者关注公众号&#xff1a;IT运维大本营&#xff0c;私信即可参加

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…

鸿蒙原生应用元服务-访问控制(权限)开发等级和类型

一、权限等级说明 根据接口所涉数据的敏感程度或所涉能力的安全威胁影响&#xff0c;ATM模块定义了不同开放范围的权限等级来保护用户隐私。 应用APL等级说明 元能力权限等级APL&#xff08;Ability Privilege Level&#xff09;指的是应用的权限申请优先级的定义&#xff0c;…

MySQL Workbench下载安装、 MySQL Workbench使用

官方下载链接;MySQL :: Download MySQL Workbench 下载好懒人安装&#xff0c;也可自己选择目录 下面是使用&#xff1a; 连接数据库&#xff1a; 填写数据库连接信息&#xff1a; 基本操作部分&#xff1a; 数据导入导出&#xff1a; 导出/备份 导入&#xff1a; 生产er图…

基于springboot实现图书进销存管理系统项目【项目源码+论文说明】

基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销…

第 6 章 URDF、Gazebo与Rviz综合应用(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.7.4 kinect信息仿真以及显示 通过 Gazebo 模拟kinect摄像头&#xff0c;并在 Rviz 中显示kinect摄像头数据…

守护脑积水宝宝,共筑健康未来

每个新生命的诞生&#xff0c;都承载着家庭的殷切期望与无尽的欢乐。然而&#xff0c;有些宝宝自诞生起便笼罩在健康的阴霾之下——脑积水。这是一种因脑脊液分泌过多或循环吸收障碍导致的疾病&#xff0c;其特征是颅内脑脊液量增加、脑室系统扩大或蛛网膜下腔扩大。脑脊液&…

【汇编语言实验九】

汇编语言实验九 在屏幕中间显示‘welcome to masm!’ assume cs:code,ds:datasgdatasg segmentdb welcome to masm! datasg endsstack segmentdw 0,0,0,0,0,0,0,0 stack endscode segment ;代码段start: nopmov cx,16mov si,0mov bx,0s: mov ax,datasgmov ds,axmov dh,02mov …