1. 程式人生 > >如何編譯各平臺使用的庫:以編譯tolua為例

如何編譯各平臺使用的庫:以編譯tolua為例

轉載地址:http://www.qingpingshan.com/rjbc/ios/239224.html

做U3D手機遊戲,最熱門的技術組合是c#+lua,使用lua是因為可以熱更新,而將c#與lua粘合起來的框架,目前最熱門的是 tolua框架 ,tolua框架有兩部分組成,一個是c#部分,一個是c部分,整個框架在遊戲程式碼中的位置是這樣子的。如下圖所示:

U3D+tolua結構

tolua C 起到承上啟下的作用,是C#和lua的中間層,在和C#互動方面,作為非c#託管程式碼,會提供一些函式讓c# DllImport,c#會通過Marshal等與非託管程式碼互動;在和lua互動方面,它符合lua擴充套件庫標準,一方面通過lua的C API與lua虛擬機器互動,另一方面會提供介面給lua指令碼使用。

還有一些lua的擴充套件庫,比如cjson、LuaSocket、sqlite3、lpeg、bit、pbc等手機遊戲常用庫,這些庫擴充套件了lua的能力,本文要介紹的就是將這些第三方擴充套件庫和lua原始碼(圖中紅色部分)一起編譯成tolua的native庫,windows平臺叫做tolua.dll,android叫做libtolua.so,mac平臺叫tolua.bundle,而iOS平臺由於不允許使用動態庫,所以會編譯成靜態庫libtolua.a。

首先,先從 tolua_runtime的github 獲取tolua.c開發包(感謝topament大佬)

在windows平臺編譯

用vs可以編譯,但是我沒試過,我是使用mingw來編譯的,需要準備的工具:msys2(這個才可以編譯x86_64)

安裝 MSYS2 ,關於如何在msys2安裝gcc和make可以參考 tolua_runtime/wiki ,安裝msys2和下載好gcc和make軟體包後(可能連結時會報找不到libintl-8.dll的錯,順便也安裝一下mingw-w64-x86_64-gettext這個軟體包,pacman -S mingw-w64-x86_64-gettext),編譯win32位程式要用mingw32.exe和編譯win64位要用mingw64.exe

來到下載好的tolua_runtime目錄,

執行指令碼build_win_32.sh,這就編譯好了windows平臺下x86動態庫。

執行指令碼build_win_64.sh,這就編譯好了windows平臺下x86_64動態庫。

指令碼主要是執行make和gcc,如過自己有一些特殊的擴充套件庫要編譯,自行修改一下指令碼新增就好,我在tolua_runtime下載下來的指令碼中添加了pbc和lsqlite3的編譯,下面是build_win64.sh的內容;

#!/bin/bash# 62 Bit Version
mkdir -p window/x86_64

cd luajit
mingw32-make clean

mingw32-make BUILDMODE=static CC="gcc -m64 -O3"
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean

cd ..

gcc -m64 -O3 -std=gnu99 -shared \
 tolua.c \
 int64.c \
 uint64.c \
 pb.c \
 pbc-lua.c \
 lsqlite3.c \
 lpeg.c \struct.c \
 cjson/strbuf.c \
 cjson/lua_cjson.c \
 cjson/fpconv.c \
 lsqlite3/shell.c \
 lsqlite3/sqlite3.c \
 luasocket/auxiliar.c \
 luasocket/buffer.c \
 luasocket/except.c \
 luasocket/inet.c \
 luasocket/io.c \
 luasocket/luasocket.c \
 luasocket/mime.c \
 luasocket/options.c \
 luasocket/select.c \
 luasocket/tcp.c \
 luasocket/timeout.c \
 luasocket/udp.c \
 luasocket/wsocket.c \
 luasocket/compat.c \-o Plugins/x86_64/tolua.dll \-I./\-Iluajit/src \-Icjson\-Iluasocket\-Ipbc\-Ilsqlite3\-lws2_32 \-Wl,--whole-archive window/x86_64/libluajit.a window/x86_64/libpbc.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++

在ming64.exe開啟的終端中進行編譯

執行指令碼編譯

將編譯好的tolua.dll拷貝到unity的Plugins下對應平臺目錄下就可以使用。

接下來編譯android平臺的動態庫,android平臺用得最多的cpu架構體系是Acorn公司的arm和Intel公司x86,由於arm市場佔有率最高,大多android的app也就只編譯了arm版本,所以Intel也專門針對arm體系架構做了一個轉換程式,也就是說,arm程式在x86機子上也可以跑起來。所以,一般來說,只要編譯arm就可以了(最常用的CPU和ABI是ARMv7a),當然,將x86也編譯起來是極好的,據以往分析閃退的經驗,在x86機子上閃退的一大元凶就是那個轉換程式出了問題,代價就是會增加包體的大小(每多支援一個CPU架構,就是多編譯一個動態庫so)。

先來看一看這個編譯指令碼build_arm.sh

cd luajit/src

# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)
NDK=D:/android-ndk-r10e
NDKABI=21
NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
NDKP=$NDKVER/prebuilt/windows-x86_64/bin/arm-linux-androideabi-
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm" 
NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"

make clean
make HOST_CC="gcc -O2 -m32" CROSS=$NDKP TARGET_SYS=Linux TARGET_FLAGS="$NDKF$NDKARCH"
cp ./libluajit.a ../../android/jni/libluajit.a
make clean

cd../../android
ndk-build clean APP_ABI="armeabi-v7a,x86"
ndk-build APP_ABI="armeabi-v7a"
cp libs/armeabi-v7a/libtolua.so ../Plugins/Android/libs/armeabi-v7a
ndk-build clean APP_ABI="armeabi-v7a,x86"

這個指令碼主要分三部分,第一部分定義變數;第二部分編譯luajit的arm版,生成luajit.a;第三部分用ndk的ndk-build程式最終編譯出libtolua.so,ndk-build其實也是封裝了make呼叫最終呼叫gcc進行交叉編譯的。

luajit的Makefile支援多平臺編譯,所以通過設定引數直接呼叫gcc進行編譯,(luajit在編譯過程中間還會生成一些中間程式碼,所以還是建議用官方提供的Makefile來編譯),但並不是所有c庫都有支援多平臺Makefile,所以最方便也最保險的方法是通過ndk-build工具和填寫Android.mk來編譯,就像第三部分那樣。看一下我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)LOCAL_MODULE := libluajit
LOCAL_SRC_FILES := libluajit.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)LOCAL_FORCE_STATIC_EXECUTABLE :=trueLOCAL_MODULE := tolua
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../luajit/src
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../lsqlite3

LOCAL_CPPFLAGS :=-O2
LOCAL_CFLAGS :=-O2 -std=gnu99
LOCAL_SRC_FILES :=../../tolua.c \
                    ../../int64.c \
                    ../../uint64.c \
                    ../../pb.c \
                    ../../lpeg.c \
                    ../../struct.c \
                    ../../pbc-lua.c \
                    ../../lsqlite3.c \
                    ../../cjson/strbuf.c \
                    ../../cjson/lua_cjson.c \
                    ../../cjson/fpconv.c \
                    ../../lsqlite3/shell.c \
                    ../../lsqlite3/sqlite3.c \
                    ../../luasocket/auxiliar.c \
                     ../../luasocket/buffer.c \
                     ../../luasocket/except.c \
                     ../../luasocket/inet.c \
                     ../../luasocket/io.c \
                     ../../luasocket/luasocket.c \
                     ../../luasocket/mime.c \
                     ../../luasocket/options.c \
                     ../../luasocket/select.c \
                     ../../luasocket/tcp.c \
                     ../../luasocket/timeout.c \
                     ../../luasocket/udp.c \
                     ../../luasocket/usocket.c \
                     ../../luasocket/compat.c \
                     ../../pbc/alloc.c \
                     ../../pbc/array.c \
                     ../../pbc/bootstrap.c \
                     ../../pbc/context.c \
                     ../../pbc/decode.c \
                     ../../pbc/map.c \
                     ../../pbc/pattern.c \
                     ../../pbc/proto.c \
                     ../../pbc/register.c \
                     ../../pbc/rmessage.c \
                     ../../pbc/stringpool.c \
                     ../../pbc/varint.c \
                     ../../pbc/wmessage.c \


LOCAL_WHOLE_STATIC_LIBRARIES += libluajit
include $(BUILD_SHARED_LIBRARY)

編譯android下的so要用mingw32.exe,下載好Android-ndk工具包,然後修改一下編譯指令碼中的ndk路徑,將ndk路徑新增到mingw-32的環境變數PATH中,執行指令碼。下面是指令碼執行過程中輸出的最後幾行資訊:

[armeabi-v7a]Compilethumb  : tolua <= stringpool.c
[armeabi-v7a]Compilethumb  : tolua <= varint.c
[armeabi-v7a]Compilethumb  : tolua <= wmessage.c
[
            
           

相關推薦

如何編譯平臺使用的編譯tolua

轉載地址:http://www.qingpingshan.com/rjbc/ios/239224.html 做U3D手機遊戲,最熱門的技術組合是c#+lua,使用lua是因為可以熱更新,而將c#與lua粘合起來的框架,目前最熱門的是 tolua框架 ,tolua框架有

Yii2擴充套件開發與程式碼複用資源包

Yii2是目前最流行的PHP開發框架之一,具有簡潔優雅、脈絡清晰、開放融合、易於擴充套件、開發高效等等特點。 在使用Yii2 Framework開發專案的過程中,必然會遇到很多複用程式碼或公共程式碼的管理問題,例如在backend和frontend都會用到的Css樣式資源、

SQLite3資料庫在嵌入式應用之三 日誌功能給出常用命令和C/C++常用API

/****************************************************** *SQLite3 比較重要的語句 *******************************************************/ #define LOG_TABLE_NAME "

Linux下的觸控板設定 Arch Linux

軟體安裝 安裝 Synaptics 驅動 # arch linux: pacman -S xf86-input-synaptics 管理工具 # xf86-input-synaptics 自帶了命令列管理工具:Synclient

LNMPA架構平臺搭建(編譯安裝的方式)雙web頁面

ORC linu mon str edi blog 初始 time 平臺 環境說明 IP 系統 需要安裝的程序 192.168.24.188 centos7 NGINX MYSQL PHP APACHE 環境準備 關閉防火墻以SELINUX [root@

LINUX下PHP編譯添加相應的動態擴展模塊so(不需要重新編譯PHP,openssl.so

down get 階段 很多 習慣 lin 模塊 臨時 操作 本文轉自:原文鏈接 http://www.cnblogs.com/doseoer/p/4367536.html 網上我看到有很多相關的文章都是簡述這個問題的,但畢竟因為LINUX版本眾多,很多LIUNX命令或路

CentOS下的編譯源代碼安裝軟件( 安裝python3 )

program source tool wget down mis prefix not centos7 在 CentOS 下安裝軟件,可以使用 rpm軟件包、yum工具、自行下載源代碼進行編譯安裝,其中編譯安裝的定制性較高 對於一些在軟件,自行下載源代碼進行編譯安裝較為方

Centos 7(Linux)環境下安裝PHP(編譯添加)相應動態擴展模塊so(openssl.so

linu *** bz2 restart lan openssl 發現 不知道 tails https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7環境下搭建好Lnmp環境之後,發現安裝的php

KuPay遊戲DApp主力落地 打造區塊鏈全生態平臺

微信公眾號:KuPay 區塊鏈被“眾星捧月”無外乎是因為它蘊含了技術和金融的雙重價值。從技術來看,這是一個獻身共同性功率且保證共同性的分散式資料庫,可用於多種技術領域保證安全和公平性。從經濟的視點來看,資訊不對稱和資金交易雙方缺乏有效信任機制,是金融業和區塊鏈融

編譯的整個過程編譯編譯、彙編、連結

編譯分為四個步驟: 每個步驟將檔案編譯成別的格式,如下: 步驟 未編譯 預編譯 編譯 彙編 連結 檔案 fun.h、fun.cpp、test.cpp

一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——實現篇(九)g711-mulaw添加新的編碼格式解析支持

調用 pcm 2個 h265 pri 源碼 返回 .cn memcpy 一、myRtspClient音頻解析架構 AudioTypeBase是處理解析各種編碼的音頻數據的接口類。處理MPA數據的MPEG_Audio類和處理g711-mulaw的PCMU_Audio類均從Au

BlockChain《Blockchain Gate》聽課筆記——POW機制闡述共識機制的激勵相容設計

BlockChain:《Blockchain Gate》聽課筆記——以POW機制為例闡述共識機制的激勵相容設計       區塊鏈技術通過巧妙的經濟激勵和技術設計,創造了一種新型自由開放系統的協作機制,能夠很好地適應經濟一體化深度發展下大規模多邊協作的技術需求。

1、利用介面實現動態的建立物件[選做題] 1.1 建立4個類 蘋果 香蕉 葡萄 園丁 1.2 在三種水果的構造方法中列印一句話. 蘋果類

package javademo9; import java.util.Scanner; interface Fruit{ } class Apple implements Fruit { public Apple() { System.out.println("建立了一個蘋

tensorflow 16資料讀取(cifar10_input.py

資料讀取概述 TensorFlow程式讀取資料一共有3種方法: 供給資料(Feeding): 在TensorFlow程式執行的每一步, 讓Python程式碼來供給資料。 從檔案讀取資料: 在TensorFlow圖的起始, 讓一個輸入管線從檔案中讀取資料。 預載

移動平臺播放器ijkplayer開源框架分析(IOS原始碼)

p_prepare_async_l呼叫stream_open,stream_open中建立了視訊渲染執行緒,該執行緒主要是進行視訊渲染工作,並對視訊進行同步,同步相關邏輯主要在這個執行緒裡面,同步的大概思路就是:有一個絕對時間作為同步起點,然後計算當前幀與上一幀時間差,然後與當前絕對時間基準源比較,如果不到時

Python sklearn實現PCA(鳶尾花分類

PCA簡介 主成分分析(Principal Component Analysis,PCA)是最常用的一種降維方法,通常用於高維資料集的探索與視覺化,還可以用作資料壓縮和預處理等。矩陣的主成分就是其協

開發人員技術學習、歸納方法(學習 Maven

本文初衷 把自己模板化 以此篇為引,與同行溝通心得,所以在此嚴重要求如果你有對應的心得還請能回覆下,真心感謝!(鞠躬) 當我們要學習新技術/東西 在過去未被自己流程化的情況下,自己學習新的東西的時候一直是處理迷迷糊糊的狀態,直到我看到這張思維

Caffe實戰系列最簡潔的Caffe安裝教程(ubuntu14.04)

網上充斥各種安裝方法,但是都很繁瑣,特別是安裝顯示卡驅動以及依賴項,對於初學者不是很方便。我覺得采用包管理工具更方便因此寫下本文。 (1)首先安裝ssh,這樣能夠使用winscp和putty或者secure crt進行遠端連線,方便在windows下載東西傳到linu

RabbitMQ入門認識並安裝RabbitMQ(Windows系統

專案需求剛剛遞交,新需求還沒來。閒下來了,寫寫部落格放鬆下。 ===========華麗的分割線================= 最近在學習Spring Cloud,其中訊息匯流排Spring Cloud Bus是必不可少的,但是Spring Cloud Bus目前只支援RabbitMQ和kafka,因

WebDriver中Action使用選擇多行為

在我們使用selenium 1.0的時候,如果需要選擇多行,可以模擬鍵盤操作按下Ctrl以及放開Ctrl鍵來控制,提供的API為: selenium.controlKeyDown(); //select action selenium.controlKeyUp(); 可是到