当前位置: 首页 > article >正文

LuaJit分析(一)LuaJit交叉编译

​​​​​​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.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


http://www.kler.cn/news/284932.html

相关文章:

  • TCP的连接与断开
  • java基础开发-xstream解析xml
  • 去中心化(Decentralization)
  • leetcode1514 最大概率路径(Bellman-ford算法详解)
  • 栈算法【基于顺序表】
  • centos 系统yum 安装 mariadb
  • UML类图中的组合关系
  • Vue3 + Axios双Token刷新解决方案
  • MySQL——多表操作(四)子查询(1)带 IN 关键字的子查询
  • Xilinx高速接口之GTP
  • CSS 预处理器
  • 10、ollama启动LLama_Factory微调大模型(llama.cpp)
  • opencv之形态学
  • 喜羊羊做Python真题
  • 基于Android+SQLite数据库开发Java考试App
  • 深度学习100问15:什么是交叉熵误差
  • 【Linux】Linux Bash Shell 教程
  • 工程师们都爱看的Docker容器技术,一看就会!保姆级教程(上)
  • Nginx负载均衡请求队列配置:优化流量管理
  • MySQL:简述事务的SQL操作
  • K8S Job
  • CSS优化实践
  • 计算机毕业设计选题推荐-二手物品回收系统-Java/Python项目实战
  • Nuxt3入门:资源文件(第2节)
  • LeetCode第65题 有效数字 结合设计模式:状态模式
  • Linux下C++编程使用动态链接库
  • Openldap可视化工具PhpLdapAdmin服务配置
  • TMPDIR在pip|pip3 install时的作用以及tmp只有noexec权限的解决方法
  • 问题记录之Qt Creator下qDebug中文乱码
  • SparkSQL缓存的用法