AARCH64-Linux-gnu交叉编译libwebsockets源码与openSSL

1.因为项目需要在板上通过websocket协议配合web服务,需要交叉编译ARM64架构的libwebsockets;

用的是libwebsockets-v4.1.5,openSSL版本openssl-1.0.2u;(由于之前版本不匹配导致交叉编译失败很多次,这个组合保证兼容性)

(1)下载libwebsockets和openSSL正确版本;

(2)优先编译openSSL

#cd进解压目录
cd /openssl-1.0.2u

#配置交叉编译器
./Configure linux-aarch64 --prefix=/home/sun/Desktop/VScode/openssl/path --cross-compile-prefix=/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

#预编译
make

#安装
make install

(3)编译libwebsockets

#cd 进解压文件夹
cd /libwebsockets-v4.1.5

#建个build
mkdir build
cd build

需要配置cmakelist.txt

# 设置安装目录
SET(CMAKE_INSTALL_PREFIX /home/sun/Desktop/VScode/arm-libwebsockets/path)

# 设置系统名称
SET(CMAKE_SYSTEM_NAME Linux)

# 设置交叉编译工具链的路径
SET(CMAKE_FIND_ROOT_PATH "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# 设置交叉编译器的路径
SET(CMAKE_C_COMPILER "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc")
SET(CMAKE_CXX_COMPILER "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++")

# 指定 OpenSSL 的包含目录和库目录
# 如果需要使用 OpenSSL,请取消注释以下两行并设置正确的路径
SET(LWS_OPENSSL_INCLUDE_DIRS /home/sun/Desktop/VScode/openssl/path/include)
SET(LWS_OPENSSL_LIBRARIES /home/sun/Desktop/VScode/openssl/path/lib)

# 如果不需要 OpenSSL,请使用以下行禁用 OpenSSL
SET(LWS_WITH_SSL ON)

# 如果需要使用内置的 SHA-1 支持,请取消注释以下行
# SET(LWS_WITHOUT_BUILTIN_SHA1 OFF)

如果不需要ssl就改成OFF

复制到cmakelist.txt这里

#
# libwebsockets - small server side websockets and web server implementation
#
# Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#

cmake_minimum_required(VERSION 2.8.12)
include(CheckFunctionExists)
include(CheckSymbolExists)
include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckLibraryExists)
include(CheckTypeSize)
include(CheckCSourceCompiles)

# 设置安装目录
SET(CMAKE_INSTALL_PREFIX /home/sun/Desktop/VScode/arm-libwebsockets/path)

# 设置系统名称
SET(CMAKE_SYSTEM_NAME Linux)

# 设置交叉编译工具链的路径
SET(CMAKE_FIND_ROOT_PATH "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# 设置交叉编译器的路径
SET(CMAKE_C_COMPILER "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc")
SET(CMAKE_CXX_COMPILER "/opt/toolchain/7.5.0/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++")

# 指定 OpenSSL 的包含目录和库目录
# 如果需要使用 OpenSSL,请取消注释以下两行并设置正确的路径
SET(LWS_OPENSSL_INCLUDE_DIRS /home/sun/Desktop/VScode/openssl/path/include)
SET(LWS_OPENSSL_LIBRARIES /home/sun/Desktop/VScode/openssl/path/lib)

# 如果不需要 OpenSSL,请使用以下行禁用 OpenSSL
SET(LWS_WITH_SSL ON)

# 如果需要使用内置的 SHA-1 支持,请取消注释以下行
# SET(LWS_WITHOUT_BUILTIN_SHA1 OFF)

# 在这里可以添加项目的其他配置和目标声明

if (POLICY CMP0048)
	cmake_policy(SET CMP0048 NEW)
endif()

#if (POLICY CMP0024)
#	cmake_policy(SET CMP0024 NEW)
#endif()

if (POLICY CMP0075)
	cmake_policy(SET CMP0075 NEW)
endif()

# General Advice
#
# For selecting between DEBUG / RELEASE, use -DCMAKE_BUILD_TYPE=DEBUG or =RELEASE
#   debug builds include source level debug info and extra logging

set(LWS_WITH_BUNDLED_ZLIB_DEFAULT OFF)
if(WIN32)
	set(LWS_WITH_BUNDLED_ZLIB_DEFAULT ON)
(省略.......)

保存cmakelist.txt

#预编译
make

#安装
make install

等待终端运行结束;

不出意外交叉编译就顺利结束了。以上方法亲测可行。

<think>嗯,用户在Ubuntu上交叉编译Erlang 19的时候遇到了一个错误,具体是在配置阶段snmp子模块的时候找不到config.guess和config.sub这两个文件。我需要先理解这个问题出现的原因,然后给出解决方案。 首先,交叉编译通常需要正确设置工具链和系统根目录。用户已经指定了--host和--build参数,看起来是对的。错误信息显示configure脚本在snmp目录下找不到config.guess和config.sub,这两个文件是用来检测系统架构的,尤其是在交叉编译时非常重要。 可能的原因是这些文件在源代码中缺失或者版本过旧,无法识别目标架构aarch64-linux-gnu。Erlang的旧版本可能自带的这些配置文件不支持较新的架构,或者用户的环境中没有正确更新这些文件。 我记得在Autotools项目中,config.guess和config.sub需要保持最新,特别是当交叉编译到比较新的平台时。解决办法通常是手动更新这两个文件,从最新的GNU config仓库获取。 接下来,用户可能需要检查otp源码目录下的这些文件是否存在,或者尝试用较新的版本替换它们。例如,可以使用wget从GNU的仓库下载最新的config.guess和config.sub,然后替换到对应的位置,比如lib/snmp目录下,或者整个项目中的各个需要的地方。 另外,用户可能需要确保整个项目中的config.sub和config.guess都被更新,而不仅仅是snmp子模块下的。因为其他模块可能也会遇到同样的问题。可以使用find命令来查找所有相关文件并替换它们。 还有,用户的环境变量设置是否正确?比如SYSROOT是否正确指向了目标系统的根目录,工具链的路径是否正确。不过从错误信息来看,问题更可能出在配置文件缺失,而不是工具链路径错误。 此外,用户可能需要安装一些依赖库的开发包,比如libssl-dev、libncurses-dev等,但错误信息中没有提到这些,所以可能暂时不需要考虑。但交叉编译时,依赖库需要针对目标架构安装,可能需要使用apt-get安装aarch64的版本,或者用户已经通过SYSROOT指定了正确的库路径。 总结下来,步骤应该是: 1. 更新config.guess和config.sub文件。 2. 确保这些文件被正确替换到所有需要的子目录中。 3. 重新运行configure命令,可能还需要清理之前的配置(make clean或删除配置缓存)。 4. 检查其他可能的依赖项,比如交叉编译所需的库是否存在于SYSROOT中。 需要注意的是,Erlang 19.3.6.13可能比较旧,可能对新的工具链支持不够好,可能需要考虑升级版本,或者寻找补丁。如果用户必须使用这个版本,手动更新配置文件可能是唯一的办法。</think>在交叉编译Erlang 19时遇到`config.guess/config.sub`缺失错误,可以通过以下步骤解决: **问题分析** 错误提示`configure: error: cannot find required auxiliary files: config.guess config.sub`表明Autotools的架构检测脚本缺失或过旧,常见于交叉编译时遇到新型处理器架构(如aarch64)。 **解决方案** 1. **更新配置文件** 从GNU官方仓库获取最新版配置文件: ```bash wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess' wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub' ``` 2. **全局替换文件** 在OTP源码根目录执行: ```bash find . -name "config.guess" -exec cp -v /path/to/new/config.guess {} \; find . -name "config.sub" -exec cp -v /path/to/new/config.sub {} \; ``` 3. **验证文件权限** ```bash chmod +x $(find . -name "config.guess" -o -name "config.sub") ``` 4. **清理并重试配置** ```bash make clean ./configure --host=aarch64-linux-gnu \ --build=x86_64-pc-linux-gnu \ --prefix=/opt/erlang-arm64 \ --enable-hipe \ --with-ssl=$SYSROOT \ --with-termcap=$SYSROOT \ CFLAGS="-I$SYSROOT/include" \ LDFLAGS="-L$SYSROOT/lib -Wl,-rpath,$SYSROOT/lib" \ erl_xcomp_sysroot=$SYSROOT \ erl_xcomp_isl=no \ erl_xcomp_clang=no ``` **补充建议** - 确保`$SYSROOT`目录包含完整的交叉编译库(如从`aarch64-linux-gnu`工具链安装) - 检查依赖项是否完整安装: ```bash sudo apt-get install libssl-dev:aarch64-linux-gnu libncurses-dev:aarch64-linux-gnu ``` - 考虑使用更新的Erlang版本(如OTP 25+)有更好的交叉编译支持 **典型依赖树示例** ``` sysroot/ ├── include/ │ ├── openssl/ # SSL头文件 │ └── ncurses.h # Termcap相关头文件 └── lib/ ├── libssl.so # SSL动态库 └── libtinfo.so # Termcap实现库 ``` 通过更新架构检测脚本和验证依赖库路径,可解决大多数交叉编译配置阶段的架构识别问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有灰机诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值