카테고리 없음

Lua script in C++

denny 2025. 2. 3. 10:45

C++에서 Lua 스크립트를 사용하려면 Lua C API 또는 Lua 바인딩 라이브러리를 활용할 수 있습니다.
아래는 대표적인 방법과 라이브러리를 정리한 것입니다.


🔥 1. Lua 공식 C API (Native 방식)

Lua는 자체적으로 C API를 제공하여 C++과 직접 연동할 수 있습니다.
하지만 API 호출이 복잡하고 번거로울 수 있어, 바인딩 라이브러리를 사용하는 것이 더 편리할 수 있습니다.

📌 설치 방법

  1. Lua 공식 구현 다운로드
    • Lua 공식 홈페이지에서 lua-5.x.x.tar.gz 다운로드
    • make linux 또는 make mingw 등으로 컴파일
    • liblua.a(정적 라이브러리) 또는 lua.dll(동적 라이브러리) 생성
  2. C++ 프로젝트에서 연결
  3. #include <lua.hpp> // Lua C API 헤더 파일

📌 Lua 스크립트 실행 (C++ 코드)

#include <iostream>
#include <lua.hpp>

int main() {
    lua_State* L = luaL_newstate();  // Lua 가상 머신 생성
    luaL_openlibs(L);               // 표준 Lua 라이브러리 로드

    // Lua 코드 실행
    if (luaL_dostring(L, "print('Hello from Lua!')")) {
        std::cerr << "Lua Error: " << lua_tostring(L, -1) << std::endl;
    }

    lua_close(L);  // Lua 가상 머신 닫기
    return 0;
}

장점: 공식 API, 경량, 빠름
단점: API 사용이 복잡하고 C++ 스타일이 아님


🔥 2. Lua 바인딩 라이브러리 (C++ 스타일)

Lua를 C++에서 쉽게 사용할 수 있도록 해주는 바인딩 라이브러리를 활용하는 방법이 있습니다.

📌 대표적인 C++ Lua 바인딩 라이브러리

라이브러리 특징

Sol2 가장 인기 있는 C++ Lua 바인딩, 모던 C++ 스타일 지원
LuaBridge 간단한 C++ 바인딩, Boost 필요 없음
Selene 헤더 전용, C++11 기반
Luabind (deprecated) 오래된 Boost 기반 바인딩 (현재 유지보수 중단)

🔥 3. Sol2 (가장 추천)

✅ Sol2 특징

  • C++11 이상 지원 (모던 C++ 스타일)
  • 쉽게 C++ 클래스 & 함수 바인딩 가능
  • Lua 스크립트 내에서 C++ 객체 직접 호출 가능
  • 헤더 전용 (Single Header 가능)

📌 Sol2 설치 방법

git clone https://github.com/ThePhD/sol2.git

또는 vcpkg를 이용한 설치

vcpkg install sol2

📌 Sol2 C++ 코드 예제

#include <sol/sol.hpp>
#include <iostream>

int main() {
    sol::state lua;  // Lua 가상 머신 생성
    lua.open_libraries(sol::lib::base);  // Lua 기본 라이브러리 열기

    lua.script(R"(
        function add(a, b)
            return a + b
        end
    )");

    int result = lua["add"](10, 20);  // Lua 함수 호출
    std::cout << "Lua add result: " << result << std::endl;

    return 0;
}

장점: 가장 강력한 바인딩, C++ 스타일, 간편한 사용
단점: 헤더 전용이라 빌드 시간이 길어질 수 있음


🔥 4. LuaBridge (간단한 바인딩)

✅ LuaBridge 특징

  • C++11 지원
  • 가볍고 Boost 없이 동작 가능
  • 클래스 바인딩 지원 (C++ 객체를 Lua에서 사용 가능)
  • Sol2보다 기능은 적지만, 단순한 사용에는 적합

📌 LuaBridge 설치 방법

git clone https://github.com/vinniefalco/LuaBridge.git

또는 vcpkg로 설치

vcpkg install luabridge

📌 LuaBridge C++ 코드 예제

#include <LuaBridge/LuaBridge.h>
#include <lua.hpp>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    // C++ 함수를 Lua에 등록
    luabridge::getGlobalNamespace(L)
        .addFunction("add", add);

    // Lua 스크립트 실행
    luaL_dostring(L, "print(add(10, 20))");

    lua_close(L);
    return 0;
}

장점: 단순한 바인딩, Boost 필요 없음
단점: 기능이 Sol2보다 부족


🚀 결론: 어떤 라이브러리를 선택해야 할까?

사용 목적 추천 라이브러리

공식 API 사용 Lua C API (lua.hpp)
모던 C++ 스타일, 강력한 기능 Sol2 (✅ 가장 추천)
가벼운 바인딩, 단순한 사용 LuaBridge
헤더 전용, 작은 프로젝트 Selene

🔥 최종 정리

✅ C++에서 Lua를 사용하려면 Lua 공식 C API 또는 바인딩 라이브러리(Sol2, LuaBridge) 활용
Sol2가 가장 쉽고 강력한 바인딩 라이브러리 (C++ 스타일 지원)
LuaBridge는 가벼운 대안 (Boost 없이 동작)
Lua C API는 직접적인 컨트롤이 가능하지만 사용이 어려움

🎮 MMORPG, 게임 엔진, AI 스크립팅 등에 Lua를 C++과 함께 활용할 수 있습니다! 🚀