1. 程式人生 > >關於Lua呼叫c++ DLL 檔案的詳解

關於Lua呼叫c++ DLL 檔案的詳解

Lua呼叫c++ dll檔案的詳解

儘管網上類似的例子不少,但是對於很多新手來說,有些問題並沒有說的那麼詳細

直奔主題

在此,我會列出我參考的文章,有些東西就直接複製的

環境:Visual C++ 2008 Express Edition + Lua 1.5 + SciTE(lua編輯器)
下載 Visual C++ 2008 Express Edition + Lua ,下載後安裝,省略N字。
環境配置:
1.開啟Visual C++ 2008(後面簡稱VC2008),新建一個C++ project,File->New Project->Empty Project,在Name欄輸入工程名,然後OK.
2.設定生成DLL檔案,右鍵工程名,Properties->Configuration Properties->General->Configuration Type->選擇Dynamic Library(.dll)


3.設定C/C++、Lua。C/C++->General->Additional Include Directories->選擇Lua的安裝路徑下的include,我Lua安裝在"C:\Program Files\Lua",我的完整路徑:"C:\Program Files\Lua\5.1\include"。
4.設定Linker:Linker->General->Additional Library Directories->選擇Lua安裝目錄下的lib目錄就可以了。我的完整路徑:"C:\Program Files\Lua\5.1\lib".
5.設定Input:Input->Additional Dependencies->這裡手動輸入"lua5.1.lib"就可以了。點選確認。

Test Lua呼叫C++函式
1.選擇Source Files,右鍵Add->New Item->選擇 C++ File(.cpp)->Add->Name欄輸入hello->Add。
2.在hello.cpp檔案中輸入下面Code.
Test Lua呼叫C++函式
1.選擇Source Files,右鍵Add->New Item->選擇 C++ File(.cpp)->Add->Name欄輸入hello->Add。
2.在hello.cpp檔案中輸入下面Code.
//----------依賴檔案-----------
//因為建的是C++ Project,所以這裡必須要加extern "C" ,如果不加這個是沒辦法編譯的。


extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <windows.h>
#include <wincrypt.h>
//因為建的是C++ Project,所以這裡必須要加extern "C"
extern "C" int hello(lua_State* L){
printf("------>>  Hi! %s \n",(LPTSTR)lua_tostring(L,1));
return 0;
}

//--------註冊函式-----------
struct luaL_reg lrLibs[] = 
{
     { "hello", hello },
     { NULL, NULL }  /* sentinel */
};
// 該函式是庫的入口函式,需要在Lua中呼叫用來註冊庫函式列表
// 因為Lua是用C語言寫的,所以匯出函式需要符合C語言呼叫規範
// 返回值:註冊的函式庫,其實為一個table
extern "C" int luaopen_hello( lua_State* L )
{
      //註冊名為hello的函式庫
     luaL_register( L, "hello", lrLibs );
     return 1;
}

看這三個函式

extern "C" int hello(lua_State* L) 

這個函式是你往DLL裡面注入的函式,其中它的引數是lua_State,這個是在LUA中的棧,它可以接受很多引數,按編號一次提取

比如說lua_tostring(L,1),就是從L中提取第一個元素,相比這個應該不難理解

struct luaL_reg lrLibs[] = 
{
     { "hello", hello },
     { NULL, NULL }  /* sentinel */
};

這個結構體很有意思,它說明了你在lua中呼叫函式的明天,“hello”是你在c++中的明天,hello是在lua中的名字

extern "C" int luaopen_hello( lua_State* L )
{
      //註冊名為hello的函式庫
     luaL_register( L, "hello", lrLibs );
     return 1;
}

最後一個函式,註冊函式在lua中的定義,很簡單,你看看就懂,就是把在hello這個dll中的函式給註冊了

當然 還有最後一個步驟

3.建一個模組定義檔案,在環境配置中說到過,這裡先不介紹怎麼配置。
A.這個時候要在當前Project下面建立檔案,檔案字尾為.def的檔案。我這裡定義的是叫“lua_c.def”的檔案。

B.這個檔案很簡單,首先在檔案最上面加上 EXPORTS,然後再將你在C++檔案中定義的那個入口函式的函式名加進來就可以了。(就是上面的luaopen_hello)。

這個有必要說明一點,

lua_c.def檔案中的應該是

EXPORTS luaopen_hello

關於luaopen_hello    後面的hello 其實不是一個單獨的意思,如果你建立的dll工程不叫hello,那麼,就把hello改成那個名字,你可以試試不改會怎麼樣,容易 讓你理解函式的意思,到此為止,基本的構架就完成了,可以去lua中測試一下吧

require("hello");
-- 在C++檔案中註冊的名字
local f = hello;
-- 呼叫C++檔案中定義的方法,"Lua"就是引數了。
f.hello("Lua");

lua中的程式碼,這個就不解釋了,應該是沒問題的

貌似不能新增附件,有問題可以問我郵箱:[email protected]

相關推薦

關於Lua呼叫c++ DLL 檔案

Lua呼叫c++ dll檔案的詳解 儘管網上類似的例子不少,但是對於很多新手來說,有些問題並沒有說的那麼詳細 直奔主題 在此,我會列出我參考的文章,有些東西就直接複製的 環境:Visual C++ 2008 Express Edition + Lua 1.5 + SciT

求助!!!關於C#呼叫C++DLL檔案中二維指標的問題

如何限定textbox的輸入內容c#讀取一個xml中註釋資訊如何限定textbox的輸入內容c#讀取一個xml中註釋資訊 為何程式中沒有看到IComparable的實現,程式也能執行?檔案寫入優化為何程式中沒有看到IComparable的實現,程式也能執行?檔案寫入優化 請問

使用g++命令生成dll檔案實現lua呼叫C程式碼

首先安裝gcc環境,下載MinGW,MinGW只是一個管理工具,真正的環境還需要在裡面下載注意選中下載項後點擊選單項中Installation--->Apply Changes才會開始下載,會下載至MinGw安裝目錄下,確保bin目錄中存在lua52.dll,lua.e

C++建構函式及顯示呼叫建構函式

                         

c語言windows.h標頭檔案

如果c語言庫裡沒有某個標頭檔案 只需要將下好的標頭檔案放入下面的路徑即可 windows.h標頭檔案包含的函式及其用法 1.GetAsyncKeyState()()//通過函式來判斷按鍵按下的狀態 主要用法是VK_鍵的名稱 例如 GetAsyncKeyState(VK_SH

c#(winform)環境下使用動態連結庫dll

  1,什麼是dll檔案? DLL(Dynamic Link Library)檔案為動態連結庫檔案,又稱“應用程式拓展”,是軟體檔案型別。在Windows中,許多應用程式並不是一個完整的可執行檔案,它們被分割成一些相對獨立的動態連結庫,

linux中C語言標頭檔案

linux中C程式標頭檔案的種類 一類:#include<stdio.h> stdio.h檔案就在/usr/include目錄下 二類:#include<arpa/inet.h> arpa/是/usr/include目錄下的子目錄,inet.h其實是/usr/include

strcpy沒有宣告 c++標頭檔案

協議分發程式程式在公司機器上編譯執行良好,而我在我的虛擬機器上編譯,卻出下如下錯誤: msg.cpp:3101: error: ‘strcpy’ was not declared in this scope 檢視原始碼已經包含了相關標頭檔案及名稱空間,如下: 而且程式

C語言標頭檔案

1. GCC編譯時問題 在由多個C語言檔案組成的程式中,對於標頭檔案的管理非常重要。標頭檔案提供給使用者一個介面,使用者從中可以知道可以呼叫哪些函式,實現哪些功能,而不必去管這些功能的具體實現。因此,寫好標頭檔案是非常關鍵的。在標頭檔案中,最常見的問題是"標頭檔案的重複包含"。其意思是同一標頭

C++建構函式及顯式呼叫建構函式(explicit)

一. 什麼是拷貝建構函式 首先對於普通型別的物件來說,它們之間的複製是很簡單的,例如: int a = 100;   int b = a;  而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。 下面看一個類物件拷貝的簡單例子。 #include &

C++:iomanip 標頭檔案

<iomanip> header IO 操作器 Header 提供操縱器的引數設定: 引數操縱器 (function ) 設定格式 flags  取消已設定的格式 flags  設定數字進位制基數(2、8、10、16) 設定填充字

C++:iterator 標頭檔案

<iterator> header 迭代器定義 一個迭代器可以是指向一定範圍內的陣列或者容器中的元素,具有在一定範圍內陣列進行迭代的操作集合(至少具有增量 ++ 能力和 dereference *運算子)。 迭代器最明顯的形式是指標。指標可以指向陣列中的元

c++建構函式及顯式呼叫建構函式

1>建構函式是幹什麼的 class Counter { public: Counter() {// 特點:以類名作為函式名,無返回型別 m_value = 0; } private: int m_value;// 資料成員 } 該類物件被

lua——alien庫實現lua呼叫C動態連結庫(dll、so)

我們知道,lua通過lua_State堆疊可以很方便的與C語言進行互動 也可以呼叫專門為lua呼叫而封裝的C庫。 具體步驟: 1.原C檔案中引入lua相關標頭檔案 #include "lua.h" #include "lualib.h" #include "lauxli

C# ListView用法

ont 結束 server 發生 匹配 鼠標 之前 小圖標 order 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有意義

C# Graphics類

一段 特定 roc sta 指定順序 rendering 嘗試 osi intersect Brush 類.NET Framework 4定義用於填充圖形形狀(如矩形、橢圓、餅形、多邊形和封閉路徑)的內部的對象。 屬於命名空間: System.Drawing這是一個抽象基

C# ListView用法(轉)

分組 創建 cti 排列 checkbox 定義 com 程序 erl 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有

【轉】讓你不再害怕指針——C指針(經典,非常詳細)

有一個 情況 value 第一個字符 接下來 意思 strcpy abcdefg 數值 前言:復雜類型說明 要了解指針,多多少少會出現一些比較復雜的類型,所以我先介紹一下如何完全理解一個復雜類型,要理解復雜類型其實很簡單,一個類型裏會出現很多運算符,他們也像普通的表

C# 泛型

安全 c++ urn 操作 類型 增加 add 應用 定義 什麽是泛型 我們在編寫程序時,經常遇到兩個模塊的功能非常相似,只是一個是處理int數據,另一個是處理string數據,或者其他自定義的數據類型,但我們沒有辦法,只能分別寫多個方法處理每個數據類型,因為

C++ STL vector

node bsp 結構體 單元 style 入隊 push_back line 數據 一.解釋:    vector(向量):是一種順序容器,事實上和數組差不多,但它比數組更優越。一般來說數組不能動態拓展,因此在程序運行的時候不是浪費內存,就是造成越界。而vector正好彌