LuaJit分析(一)LuaJit交叉编译

​​​​​​Android

使用ndk版本 r16b

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

bash 复制代码
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版本类似):

bash 复制代码
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下的链接器:

bash 复制代码
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如下:

bash 复制代码
TARGET_LD= $(CROSS_LD)

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

IOS

bash 复制代码
#!/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.0
 
IOSDIR=$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/build
  
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
rm *.a 1>/dev/null 2>/dev/null
  
  
echo =================================================
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.a
  
libtool -o $BUILD_DIR/$LIBNAME $BUILD_DIR/*.a 2> /dev/null
 
mkdir -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
相关推荐
UWA4 小时前
Unreal开发痛点破解!GOT Online新功能:Lua全监控 + LLM内存可视化!
开发语言·lua·unreal
1nullptr4 小时前
Lua迭代器与泛型for
lua
半夏知半秋4 小时前
skynet debug_console控制台中debug指令使用
服务器·开发语言·学习·lua
h7997108 小时前
redis lua脚本(go)调用教程以及debug调试
redis·golang·lua
玩转C语言和数据结构3 天前
Lua下载和安装教程(附安装包)
lua·lua下载·lua安装教程·lua下载和安装教程·lua安装包
Arva .4 天前
HTTP Client
网络协议·http·lua
爱吃小胖橘4 天前
Lua语法(2)
开发语言·unity·lua
ellis19705 天前
LuaC API知识点汇总
unity·lua
爱吃小胖橘8 天前
Lua语法
开发语言·unity·lua
东方芷兰8 天前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua