1. 程式人生 > >Linux環境下 lua 呼叫自定義so動態庫(skynet)

Linux環境下 lua 呼叫自定義so動態庫(skynet)

最近看的 skynet 使用的 c+lua 的架構,框架提供的是基礎的api,所以業務邏輯還得自己去寫,如果某些業務邏輯比較耗效能,那可能就需要把某些業務邏輯丟到 c/c++ 去做,提供個介面供 lua 呼叫。
那麼就需要去編個動態庫(.so)、靜態庫(.a)啥的

  1. 寫c介面(有些型別不嚴謹,就偷懶不改了,編譯時會warning,可無視)
    #include <lua.h>
    #include <lauxlib.h>
    #include <stdio.h>
     
    static int ltest1(lua_State *L) {
        int num = luaL_checkinteger(L, 1);
        printf("--- ltest1, num:%d\n", num);
        return 0;
    }
     
    static int ltest2(lua_State *L) {
        size_t len = 0;
        const char * msg = luaL_checklstring(L, 1, &len);
        printf("--- ltest2, msg:%s, len:%d\n", msg, len);
        return 0;
    }
     
    static int ltest3(lua_State *L) {
        size_t len = 0;
        int num = luaL_checkinteger(L, 1);
        const char * msg = luaL_checklstring(L, 2, &len);
        printf("--- ltest3, num:%d, msg:%s, len:%d\n", num, msg, len);
        return 0;
    }
     
    int luaopen_myLualib(lua_State *L) {
     
        luaL_Reg l[] = {
            { "test1", ltest1 },
            { "test2", ltest2 },
            { "test3", ltest3 },
            { NULL, NULL },
        };
        luaL_newlib(L, l);
     
        return 1;
    }


  2. 寫makefile檔案
    CC ?= gcc
    CFLAGS = -g -O2 -Wall -I$(LUA_INC)
    SHARED := -fPIC --shared
     
    TARGET = myLualib.so
    LUA_CLIB_PATH = clib
     
    # 引入lua標頭檔案
     
    LUA_INC ?= /root/lua-5.3.0/src
     
    start: $(TARGET)
     
    $(TARGET) : myLualib.c | $(LUA_CLIB_PATH)
        $(CC) $(CFLAGS) $(SHARED) $^ -o [email protected]
     
    clean:
        rm -fr $(TARGET)
     
    $(LUA_CLIB_PATH) :
        mkdir $(LUA_CLIB_PATH)


  3. 執行以下make命令,注意target是start
    # make start然後myLualib.so就出來了

  4. 寫個lua測試以下 (檔名 mylua.lua)
    function test3( ... )
        print("----- test myCustomLib")
        package.cpath = "./?.so" --so搜尋路勁
        local f = require "myLualib" -- 對應luaopen_myLualib中的myLualib
     
        f.test1(123)
        f.test2("hello world")
        f.test3(456, "yangx")
    end
     
    test3()


    執行以下
    # lua mylua.lua結果

    [[email protected]]# lua mylua.lua 
    -----testmyCustomLib
    ---ltest1,num:123
    ---ltest2,msg:helloworld,len:11
    ---ltest3,num:456,msg:yangx,len:5

相關推薦

Linux環境 lua 呼叫定義so動態skynet

最近看的 skynet 使用的 c+lua 的架構,框架提供的是基礎的api,所以業務邏輯還得自己去寫,如果某些業務邏輯比較耗效能,那可能就需要把某些業務邏輯丟到 c/c++ 去做,提供個介面供

Java呼叫C++編寫的動態JNI

1. 在eclipse裡利用java建立一個類,在類中加入帶有native的方法(eclipse建立的類會自動新增class在bin目錄下) 2.利用javah命令生成本地方法的c++標頭檔案。進入到工程bin目錄下,按住shift,並右擊,選擇 “在此處開啟命令視窗”,進入命令視

linux/mac的配置定義命令alias

root commit 測試 自定義命令 bashrc 文件 自動 一個 cdr linux/mac下的自定義命令alias,並保存別名使其永久生效(重啟不會失效) 在做開發每次提交代碼的命令都是一長串參數,不想去記,於是可以使用alias命令來解決這個問題:alias a

Spring boot專案打包成jar在linux環境設定開機啟動【原創】

#!/bin/bash # The three branches of the scouting program,Add to auto. # chkconfig: 2345 20 80 # description: py-0.0.1-SNAPSHOT-exec.jar #

Linux環境java呼叫ffmpeg命令進行視訊轉碼

1.這是在Linux系統下的程式碼,我執行後可以轉換成功: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import

VS2017 Linux C++引用定義動態

++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後

***在Linux環境mysql的root密碼忘記解決方法三種-推薦第三種

href containe 完全 mys init.d 操作 root ubunt upd MySQL密碼的恢復方法之一 1.首先確認服務器出於安全的狀態,也就是沒有人能夠任意地連接MySQL數據庫。 因為在重新設置MySQL的root密碼的期間,MySQL數據庫完全出於沒

Linux環境mysql讀寫分離以及主從配置不錯可以的

記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案       Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改

android 定義ListView實現拉重新整理、分頁載入、點選事件——定義控制元件學習

package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message

00 Linux環境ARM裸機開發工程的建立示例Cortex-A8

Linux環境下ARM裸機開發工程的建立示例(Cortex-A8)      本文將介紹如何在Linux環境下建立一個ARM的裸機開發專案工程,其內容將涉及Linux c語言,ARM組合語言,Linux shell命令與及Linux工程管理器make的配置檔案--Mak

【朝花夕拾】Android定義View篇之Android事件分發機制解決滑動衝突

前言        前面兩篇文章,花了很大篇幅講解了Android的事件分發機制的原理性知識。然而,“紙上得來終覺淺,絕知此事要躬行”,前面講的那些原理,也都是為解決實際問題而服務的。本文將結合實際工作中經常遇到的滑動衝突案例,總結滑動衝突的場

【朝花夕拾】Android定義View篇之Android事件分發機制滑動衝突解決方案總結

前言        轉載請宣告,轉自【https://www.cnblogs.com/andy-songwei/p/11072989.html】,謝謝!        前面兩篇文章,花了很大篇幅講解了Android的事件分發機制的

【朝花夕拾】Android定義View篇之多點觸控實踐出真知

前言        在上一篇文章中,已經總結了MotionEvent以及多點觸控相關的基礎理論知識和常用的函式。本篇將通過實現單指拖動圖片,多指拖動圖片的實際案例來進行練習並實現一些效果,來理解前面的理論知識。要理解本文的程式碼,需要先掌握上一篇的理論知識,事件處理基

xgboost 定義評價函數metric與目標函數

binary ret and 參數 cnblogs from valid ges zed 比賽得分公式如下: 其中,P為Precision , R為 Recall。 GBDT訓練基於驗證集評價,此時會調用評價函數,XGBoost的best_iteration和

ssh環境客戶信息管理系統學習問題

2.3 根據 包括 style 有用 信息 org 翻譯 use 問題1: 這是包沖突的問題,jar包中存在兩個沖突的包,可以看到上面的Referenced Libraries中存在asm.jar和asm-2.2.3.jar兩個包,這兩個包沖突了

XAF 框架中,定義參數動作Action,輸入參數的控件可定義,用於選擇組織及項目

示例 app frame tro href express documents 定義 ron XAF 框架中,如何生成一個自定義參數動作(Action),輸入參數的控件可定義? 參考文檔:https://documentation.devexpress.com/eXpres

AngularJs定義指令詳解5 - link

演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) {  // 在這裏操作DO

sench touch 定義小圖標

found conf custom cmd svg logs 頁面 一個 會有 自定義圖標的方法 Sencha touch自帶圖標有限,有時需要自己添加圖標。下面介紹自定義圖標的方法: 首先需要生成圖標字體。有許多網站提供在線生成圖標字體的功能,比如IcoMoon,通過這個

vue2 定義 折疊列表Accordion組件

rep link 分享圖片 toggle sset pac baseline object 列表 1.自定義 折疊列表 Accordion.vue <!-- 折疊列表 組件 --> <template> <nav :class="$st

ASP.NET MVC 學習筆記-7.定義配置信息後續

字符串 return abstract 新的 work 生成 value DC 連接字符串加密 自定義配置信息的高級應用 通過上篇博文對簡單的自定義配置信息的學習,使得更加靈活的控制系統配置信息。實際項目中,這種配置的靈活度往往無法滿足項目的靈活度和擴展性。 比如,一個