2013-10-26 14 views
7

Trong ứng dụng của tôi, tôi có tất cả các thư viện Lua được hiển thị từ phần phụ trợ C. Bây giờ, tôi có một nhu cầu để tải một mô-đun Lua. Phương pháp này có vẻ là:Nhúng mô-đun LuaJIT vào ứng dụng C

lua_getglobal(L, "require"); 
lua_pushstring(L, libname); 
lua_pcall(L, 1, 0, 0); 

mà sẽ tìm kiếm package.path để tìm <libname>.lua và tải nó.

Có thể xây dựng trong mô-đun Lua vào ứng dụng C (để mô-đun trở thành một phần của ứng dụng C) không? để tôi không phải gói riêng mô-đun Lua. Bằng cách nào đó tôi không thể tìm thấy bất kỳ tài liệu tham khảo hoặc ví dụ về điều này! :(

ps Tôi đang sử dụng LuaJIT-2.0.2, và thư viện trong câu hỏi là SciLua/Time (sử dụng ffi)

+2

có thể trùng lặp của [Chạy tệp đối tượng luajit từ C] (http://stackoverflow.com/questions/19416981/running-luajit-object-file-from-c) –

Trả lời

6

Có.

luajit -b Module.lua Module_bc.c 

sẽ biên soạn một module để bytecode và đầu ra một initializer mảng C có chứa bytecode Nếu bạn xây dựng với các thư viện được bật và xuất mảng này từ tệp thực thi chính, require sẽ tìm thấy nó (và sẽ không cần tìm kiếm Module.lua.)

Để kiểm tra xem thiết bị có đang hoạt động hay không, hãy đặt package.path = "" trước khi require nhập mô-đun. Nếu nó vẫn hoạt động, bạn biết tải trước đang hoạt động và không chỉ sử dụng tệp Module.lua từ thư mục hiện tại.

http://luajit.org/running.html

Những điều khác cần lưu ý:

  • Nếu module phụ thuộc vào một tập tin bên ngoài (sử dụng io.open), tập tin đó vẫn cần phải có mặt. Ví dụ: một số mô-đun ffi cố gắng mở tệp tiêu đề C, để chuyển đến ffi.cdef
  • Bạn cần giữ Module_bc.c đồng bộ hóa với Module.lua, ví dụ: với một công thức Makefile, hoặc bạn sẽ thấy một số lỗi khó hiểu!
+0

Tôi hiểu ý tưởng và thấy bài viết khác được Mike nhắc tới. Nhưng trong ứng dụng của tôi, tôi không có ý định sử dụng bất kỳ thư viện được chia sẻ nào. Vì vậy, sự hiểu biết của tôi là, tôi cần 'luajit' tạo ra BC mảng, và tôi cần phải làm' package.preload', nhưng tôi * không * muốn các kịch bản để gọi 'require', vì vậy tôi cũng cần phải làm 'lua_getglobal (L," yêu cầu "), lua_pushliteral (L," module ")' trên trạng thái Lua. chính xác? – vyom

+0

Nếu bạn không muốn kịch bản lệnh gọi 'require', bạn cũng cần phải lưu trữ đối tượng mô-đun trong bảng chung. Và có thể sử dụng 'luaL_loadbuffer' thay vì' require'. Và tạo tệp '.h' thay vì tệp' .c' từ 'luajit -b', vì phiên bản' .h' bao gồm trường độ dài nhưng phiên bản '.c' không (và bạn cần độ dài để chuyển đến 'luaL_loadbuffer'.) – finnw

Các vấn đề liên quan