LuaJit分析(一)LuaJit交叉编译

news/2024/11/15 6:02:39/

​​​​​​Android

使用ndk版本 r16b 

luajit2.1.0-beta3目录下创建一个脚本文件,armv7编译代码如下:

make clean
NDK=E:/android-ndk-r16b #ndk路径
NDKABI=21
NDKTRIPLE=arm-linux-androideabi
NDKVER=$NDK/toolchains/$NDKTRIPLE-4.9
NDKP=$NDKVER/prebuilt/windows-x86_64/bin/$NDKTRIPLE-
NDKF="-isystem $NDK/sysroot/usr/include/$NDKTRIPLE -D __ANDROID_API__=$NDKABI -D _FILE_OFFSET_BITS=32"
NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"
NDK_SYSROOT_BUILD=$NDK/sysroot
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm
make CC="gcc" HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH" TARGET_SYS=Linux TARGET_SHLDFLAGS="--sysroot $NDK_SYSROOT_LINK" TARGET_LDFLAGS="--sysroot $NDK_SYSROOT_LINK" TARGET_CFLAGS="--sysroot $NDK_SYSROOT_BUILD -std=c11"

NDKP指定了ndk编译器的前缀
NDKARCH指定了编译成armv7平台
NDK_SYSROOT_BUILD指定了头文件目录
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm指定了链接时的库文件目录

1、Windows下编译:
启动cygwin64,切换到luajit目录,sh运行脚本(需要安装make)

2、Linux下编译:
sh运行脚本,注意ndk路径

clang编译:

测试时使用的最新的NDK版本(r20)已经删除了gcc,只能使用clang编译,clang编译可以方便的对代码进行混淆,ndk-r20进行clang编译的脚本如下(其它NDK版本类似):

make clean
NDK=/home/guohao/android-ndk-r20
NDKABI=21
NDKTRIPLE=arm-linux-androideabi
NDKVER=$NDK/toolchains/llvm
NDKP=$NDKVER/prebuilt/linux-x86_64/bin/$NDKTRIPLE-
NDKARCH="--target=armv7a-linux-androideabi$NDKABI -mfloat-abi=softfp"
NDK_SYSROOT_HEAD="-isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm/usr/lib
make CC="clang" HOST_CC="gcc -m32" TARGET_FLAGS="$NDKARCH" CROSS=$NDKP TARGET_SYS=Linux TARGET_SHLDFLAGS="" TARGET_LDFLAGS="-L $NDK_SYSROOT_LINK " TARGET_CFLAGS="$NDK_SYSROOT_HEAD $NDKARCH -std=c11"

其中 CC指定使用编译器为clang,将$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin 目录下的clang文件复制一份命名为arm-linux-androideabi-clang 
NDKARCH指定了clang编译器生成的文件平台,NDK_SYSROOT_HEAD指定了编译过程中需要的头文件 
NDK_SYSROOT_LINK指定了链接过程中需要的库文件

比较老的NDK版本中(如r16b)既有clang编译器,又有gcc编译器,但是clang编译器的目录下没有链接器,这是需要修改Makefile文件,指定链接时用gcc下的链接器:

make clean
NDK=E:/android-ndk-r16b
NDKABI=21
NDKTRIPLE=arm-linux-androideabi-
NDKVER=$NDK/toolchains/llvm
NDKP=$NDKVER/prebuilt/windows-x86_64/bin/
NDKARCH="--target=armv7a-linux-androideabi$NDKABI -mfloat-abi=softfp"
NDK_SYSROOT_HEAD="-isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
NDK_SYSROOT_LINK=$NDK/platforms/android-$NDKABI/arch-arm
make CC="clang" HOST_CC="gcc -m32" TARGET_FLAGS="$NDKARCH" CROSS=$NDKP TARGET_SYS=Linux TARGET_SHLDFLAGS="" TARGET_LDFLAGS="-L $NDK_SYSROOT_LINK " TARGET_CFLAGS="$NDK_SYSROOT_HEAD $NDKARCH -std=c11" CROSS_LD="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc $NDK_SYSROOT_HEAD --sysroot $NDK_SYSROOT_LINK"

其中CROSS_LD指定了编译完后链接时使用的链接器,这里使用gcc,同时修改Makefile文件211行的TARGET_LD如下:

TARGET_LD= $(CROSS_LD)

同时 将 ar 和 strip 拷贝过来到clang目录



IOS

#!/bin/bash# LuaJIT 的源码路径
LUAJIT=.XCODEPATH=`xcode-select -print-path`
DEVDIR=$XCODEPATH/Platforms
IOSVER=iPhoneOS.sdk
SIMVER=iPhoneSimulator.sdk# 库的最总名称
LIBNAME=libluajit-2.1.0-beta3.a# iOS 最低兼容版本,最好与需要嵌入 LuaJIT 的 App 的最低兼容设置保持一致.
MINVERSION=9.0IOSDIR=$DEVDIR/iPhoneOS.platform/Developer
SIMDIR=$DEVDIR/iPhoneSimulator.platform/Developer# xctoolchain 可以使用 xcode-select --install 命令安装.
# xctoolchain 和模拟器中, 目前已不包含 gcc 等命令,可以从系统其它位置复制到 $IOSBIN 目录.
# 命令的具体路径,可以执行 xcodebuild -find gcc 获得.
IOSBIN=$XCODEPATH/Toolchains/XcodeDefault.xctoolchain/usr/bin/
SIMBIN=$SIMDIR/usr/bin/BUILD_DIR=$LUAJIT/buildrm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
rm *.a 1>/dev/null 2>/dev/nullecho =================================================
echo ARM64 Architecture
ISDKF="-arch arm64 -isysroot $IOSDIR/SDKs/$IOSVER -miphoneos-version-min=$MINVERSION -fembed-bitcode"
#make -j -C $LUAJIT CC="clang" HOST_CC="clang" CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS clean
make -j -C $LUAJIT CC="clang" HOST_CC="clang" CROSS=$IOSBIN TARGET_FLAGS="$ISDKF" TARGET=arm64 TARGET_SYS=iOS
mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajit64bit.a# echo =================================================
# echo IOS Simulator Architecture
# ISDKF="-arch x86_64 -isysroot $SIMDIR/SDKs/$SIMVER -miphoneos-version-min=$MINVERSION"
# make -j -C $LUAJIT CC="clang" HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 clean
# make -j -C $LUAJIT CC="clang" HOST_CFLAGS="-arch x86_64" HOST_LDFLAGS="-arch x86_64" TARGET_SYS=iOS TARGET=x86_64 amalg CROSS=$SIMBIN TARGET_FLAGS="$ISDKF"# mv $LUAJIT/src/libluajit.a $BUILD_DIR/libluajitx86_64.alibtool -o $BUILD_DIR/$LIBNAME $BUILD_DIR/*.a 2> /dev/nullmkdir -p $BUILD_DIR/headers
cp $LUAJIT/src/lua.h $BUILD_DIR/headers
cp $LUAJIT/src/lauxlib.h $BUILD_DIR/headers
cp $LUAJIT/src/lualib.h $BUILD_DIR/headers
cp $LUAJIT/src/luajit.h $BUILD_DIR/headers
cp $LUAJIT/src/lua.hpp $BUILD_DIR/headers
cp $LUAJIT/src/luaconf.h $BUILD_DIR/headers


http://www.ppmy.cn/news/1518851.html

相关文章

QT基础之【模块】

QT基础之【模块】 写在前面版本信息内容全部模块QT基本模块QT附加模块增值模块技术预览模块QT工具 补充模块路径网络资料简要描述 摘要: 1.本文介绍了QT5.12.9的模块,主要核心内容来源于帮助文档,少量整理网络中的资料 2.分析查看安装中径中的…

代码随想录——回文子串(Leetcode 647)

题目链接 我的题解(双指针) 思路: 当然,以下是对您提供的代码的解释: class Solution {public int countSubstrings(String s) {// 初始化回文子字符串的数量int count 0;// 遍历字符串的每个字符,使用…

嵌入式Linux C应用编程指南-进程、线程(速记版)

第九章 进程 9.1 进程与程序 9.1.1 main()函数由谁调用? C 语言程序总是从 main 函数开始执行,main()函数的原型是: int main(void) 或 int main(int argc, char *argv[])。 操作系统下的应用程序在运行 main()函数之前需要先执行一段引导代…

深入解析HarmonyOS Image组件的使用与优化

在现代移动应用开发中,图像处理是一个至关重要的部分。HarmonyOS 提供了功能强大的图像组件,允许开发者从多种来源显示图像,如本地资源、网络资源、资源文件、媒体库和 Base64图像编码。本篇博客将深入探讨如何接地使用图像组件,并…

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目: 题解: func deserialize(s string) *NestedInteger {index : 0var dfs func() *NestedIntegerdfs func() *NestedInteger {ni : &NestedInteger{}if s[index] [ {indexfor s[index] ! ] {ni.Add(*dfs())if s[index] , {index}}indexreturn…

C/C++二维码生成库qrencode编译与使用

1 qrencode介绍 qrencode 是一个用于生成 QR 码(Quick Response Code)的工具和库。QR 码是一种矩阵条形码或二维条形码,能够在水平和垂直方向上存储信息。qrencode 支持多种编码方式,并能够生成不同复杂度和错误校正级别的 QR 码…

R语言统计分析——单因素协方差分析

参考资料:R语言实战【第2版】 单因素协方差分析(ANCONA)扩展了单因素方差分析(ANOVA),包含一个或多个定量的协变量。下面使用multcomp包中的litter数据集进行操作: # 加载数据集 data(litter,p…

web笔记:JSP基础

一、什么是JSP? 建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在。 HTML代码用来实现网页中静态内容的显示。Java代码用来实现网页中动态内容的显示。 二、JSP的运行原理 由JSP引擎(JSP容器)将jsp转换为Servlet 当客…