카테고리 없음
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 호출이 복잡하고 번거로울 수 있어, 바인딩 라이브러리를 사용하는 것이 더 편리할 수 있습니다.
📌 설치 방법
- Lua 공식 구현 다운로드
- Lua 공식 홈페이지에서 lua-5.x.x.tar.gz 다운로드
- make linux 또는 make mingw 등으로 컴파일
- liblua.a(정적 라이브러리) 또는 lua.dll(동적 라이브러리) 생성
- C++ 프로젝트에서 연결
- #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++과 함께 활용할 수 있습니다! 🚀