记录交叉编译环境配置--海思开发板的 嵌入式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,一经查实,立即删除!

相关文章

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

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化&#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;其删除…

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

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

【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;主机和存储网络连…

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;当中可以分为基本面和技术面两大流…

C++智能指针(二十)

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

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求&#xff0c;返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析&#xff0c;…

RS232、RS485、RS422、TTL、CAN各自的区别

目录 一&#xff1a;工业串口通信标准RS232、RS485、RS422的区别 第一个区别、硬件管脚接口定义不同 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别&#xff0c;逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 二&#xff1a;RS232、RS…

docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建

go-cqhttp&#xff0c;基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现&#xff0c;只需简单的配置, 就可以基于 go-cqhttp 使用框架开发&#xff0c;具有轻量, 原生, 高并发, 低占用, 跨平台等特点。 1 go-cqhttp 官网及可执行文件下载链接 go-cqhttp 官网&#xff1a;ht…

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下&#xff0c;具有一定的顺序性&#xff0c;就叫做同步。在多道程序系统中&#xff0c;由于资源有限&#xff0c;进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突&#xff0c;保证进程或线程之间能够按照既定…

泛型的初步认识(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

优思学院|ISO45001职业健康安全管理体系是什么?

ISO45001:2018是新公布的国际标准规范&#xff0c;全球备受期待的职业健康与安全国际标准&#xff08;OH&S&#xff09;于2018年公布&#xff0c;并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001&#xff0c;成为全球工作场所健康与安全的参考。 ISO45001:201…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址&#xff1a;API平台源码 这套源码是使用thinkphp3.1.3开发的&#xff0c;可以在PHP5.3-5.6下运行&#xff0c;程序是有一点老了&#xff0c;但是思路仍在&#xff01;然后&#xff0c;这套源码我已经成功搭建起来了&#xff0c;后台、个人&#xff08;用户&#xff0…

在瑞芯微RV1126 Linux系统上调试WiFi的详细指南

目录标题 1. **系统和环境准备**2. **检查WiFi设备状态**3. **启用和禁用WiFi接口**4. **扫描可用的WiFi网络**5. **连接到WiFi网络**6. **查看当前的WiFi连接状态**7. **断开和重新连接WiFi**8. **管理WiFi网络配置**9. **使用iw工具进行高级WiFi调试**10. **故障排除和日志获…

算法训练营day16

一、二叉树的最大深度 递归解法 后序遍历(DFS) class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }算法解析&#xff1a; 终止条件&#xff1a; 当 root 为空&#xff0c;…