11

LuaJIT を C アプリケーションに埋め込もうとしています。コードは次のようになります。

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>

int barfunc(int foo)
{
    /* a dummy function to test with FFI */ 
    return foo + 1;
}

int
main(void)
{
    int status, result;
    lua_State *L;
    L = luaL_newstate();

    luaL_openlibs(L);

    /* Load the file containing the script we are going to run */
    status = luaL_loadfile(L, "hello.lua");
    if (status) {
        fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
        exit(1);
    }

    /* Ask Lua to run our little script */
    result = lua_pcall(L, 0, LUA_MULTRET, 0);
    if (result) {
        fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
        exit(1);
    }

    lua_close(L);   /* Cya, Lua */

    return 0;
}

Lua コードは次のようになります。

-- Test FFI
local ffi = require("ffi")
ffi.cdef[[
int barfunc(int foo);
]]
local barreturn = ffi.C.barfunc(253)
io.write(barreturn)
io.write('\n')

次のようなエラーが報告されます。

Failed to run script: hello.lua:6: cannot resolve symbol 'barfunc'.

私は周りを検索しましたが、 ffi モジュールに関するドキュメントはほとんどないことがわかりました。どうもありがとう。

4

3 に答える 3

9

ffi ライブラリには luajit が必要なため、lua コードを luajit で実行する必要があります。ドキュメントから:「FFI ライブラリは LuaJIT に緊密に統合されています (別のモジュールとしては利用できません)」。

luajitを埋め込む方法は?「Embedding LuaJIT」の下のhttp://luajit.org/install.htmlを参照してください。

あなたの例の下で、私が追加した場合に実行します

__declspec(dllexport) int barfunc(int foo)

barfunc 関数で。

Windows では、luajit は dll としてリンクされています。

于 2011-05-07T12:33:30.470 に答える
3

misianne が指摘したように、関数をエクスポートする必要があります。これは、GCC を使用している場合はexternを使用して実行できます。

extern "C" int barfunc(int foo)
{
    /* a dummy function to test with FFI */ 
    return foo + 1;
}

GCC を使用する Linux で未定義のシンボルに関する問題が発生している場合は、 -rdynamicフラグを GCC に渡して、リンカがすべてのシンボルを動的シンボル テーブルに追加するように注意してください。

g++ -o アプリケーション soure.cpp -rdynamic -I... -L... -llua

于 2012-04-22T19:20:26.757 に答える
2

C++コンパイラを使用して、VC++(2012以降)を使用してWindowsでこれを機能させようとしている人のために:

  • .cpp 拡張子を使用していることを確認してください。これにより、C++ コンパイルが行われます。
  • ffi がリンクできるように、関数に外部 C リンケージを持たせます。extern "C" { ... }
  • 実行可能ファイルから関数をエクスポートします。__declspec(dllexport)
  • 必要に応じて、呼び出し規約を指定します。__cdeclデフォルトで必要であり、移植可能ではないため、必須ではありません
  • Lua ヘッダーを でラップしますextern "C" { include headers }#include "lua.hpp"

    #include "lua.hpp"  
    
    extern "C" {
    __declspec(dllexport) int __cdecl barfunc(int foo) { 
     return foo + 1;
    }}
    
于 2013-11-15T00:08:18.660 に答える