2011-02-26 53 views
6

Tôi muốn viết một C++ - Chương trình có thể tương tác/gọi Lua-script trong khi thực thi. Một khái niệm quan trọng của chương trình là hoàn toàn độc lập nền tảng, nhưng tôi dường như không thể xác định vị trí một Lua-xây dựng mà thực sự cung cấp cái gì đó.Nhúng Lua vào C++

Các bản dựng Lua tôi tìm thấy cho đến nay dựa trên biến môi trường hoặc các thư viện cụ thể như .lib, .dll hoặc .so. Lua-source chính thức từ lua.org cũng không phải là những gì tôi đang tìm kiếm vì nó định nghĩa một chức năng chính…

Có một trường hợp đơn giản - tốt nhất sẽ là một cái gì đó giống như sqlite-amalgamation - Lua-interpreter cho C/C++ không có bất kỳ phụ thuộc nào trong số này?

Trả lời

7

lua.c chứa chính và xác định điểm nhập cho ứng dụng bảng điều khiển. Nếu bạn xóa nó khỏi dự án, những gì còn lại sẽ tích hợp vào một thư viện độc lập hoặc thư viện động nếu bạn thích, tốt thôi.

+0

Cảm ơn câu trả lời của bạn! Chỉ cần nhận thấy rằng lua.c (độc lập thông dịch viên) và luac.c (Lua-to-Bytecode-Compiler) có chứa một chính - kinda lạ rằng nguồn không được tách thành các thư mục khác nhau ... – MFH

+0

@MFH, tổ chức này là khá điển hình cho các dự án dựa trên Makefile cổ điển. Lưu ý tuổi tổng thể của Lua. Makefile không xây dựng (tùy thuộc vào nền tảng) cả thư viện tĩnh và động từ lõi, sau đó biên dịch lua.c và luac.c liên kết với chúng khi thích hợp. – RBerteig

+0

aha, một cách trung thực, mặc dù tôi đã sử dụng MAKEFILES một chút, tôi chưa bao giờ thực sự yêu thích chúng và tôi luôn chia ứng dụng thành các thư mục khác nhau… – MFH

4

Sau đây là những gì tôi sử dụng như là một điểm khởi đầu cho các dự án của tôi (tôi tìm thấy một cái gì đó tương tự một khi trở lại và chuyển thể nó vì vậy tôi có thể thay đổi nó nhanh hơn):


Các lua script file:

-- Start 
    -- Script: myscript.lua 
    print("this is lua") 
    -- End 

Các tập tin C:

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

    int main(void) { 
      static const luaL_reg lualibs[] = { 
        { "base",  luaopen_base }, 
        { NULL,   NULL } 
      }; 

      static void openlualibs(lua_State *l) { 
        const luaL_reg *lib; 

        for (lib = lualibs; lib->func != NULL; lib++) { 
          lib->func(l); 
          lua_settop(l, 0); 
        } 
      } 

      lua_State *l; 
      l = lua_open(); 
      openlualibs(l); 

      printf("now calling lua\n\n"); 
      lua_dofile(l, "myscript.lua"); 
      printf("\ndo something else\n\n"); 

      lua_close(l); 
      return 0; 
    } 

Bạn có thể sử dụng tiện ích này làm cơ sở cho các dự án của mình.

2

Để xây dựng một tập hợp hỗn hợp đơn của lõi Lua và trình thông dịch độc lập, hãy xem tệp etc/all.c trong bộ nguồn chính thức. Bạn chắc chắn có thể sử dụng nó làm cơ sở cho sự hợp nhất của riêng bạn, có lẽ bằng cách loại bỏ tham chiếu đến lua.c trên dòng cuối cùng.

Nhiều ứng dụng lớn hơn nhúng Lua làm điều đó bằng cách thêm các tệp nguồn lõi vào dự án. Điều này đặc biệt hiệu quả nếu ứng dụng dự định không cho phép mã mở rộng tải các mô-đun được biên dịch từ các tệp .dll hoặc .so. Nếu ứng dụng của bạn sẽ cho phép các mô-đun được biên dịch, thì tốt nhất là liên kết với thư viện được chia sẻ cho lõi để ứng dụng và các mô-đun nạp có thể tham chiếu các biểu tượng từ một cá thể của thư viện lõi. Lưu ý rằng tình cờ bao gồm nhiều trường hợp của lõi Lua gần như được đảm bảo để sản xuất rất khó chẩn đoán các triệu chứng.