如何編譯各平臺使用的庫:以編譯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();
可是到