2009-05-19 2 views
3

많은 수의 클래스 (150+)가있는 C++ 프로젝트에서 각각 10 ~ 300 개 정도의 필드가 있습니다. 필자는 테스트 목적으로 스크립팅 인터페이스를 제공하여 재 컴파일이 필요없는 콜백을 코딩 할 수 있기를 정말로 원합니다. 루아에서 파이썬의 것보다 C API에 익숙해 졌기 때문에이 작업을하고 싶습니다. 그러나 두통을 덜어 준다면 파이썬에서 처리하게되어 기쁩니다.Swig을 통해 C++과 Lua 사이의 변수 전달

저는 C++에서 루아 함수를 호출하는 방법에 대한 확실한 이해를 가지고 있으며, 기본적인 데이터 형식을 앞뒤로 전달하는 방법을 알고 있습니다. 내가 가진 질문은 SWIG를 사용하여 둘 사이에서 사용자 지정 데이터 유형을 공유하는 방법입니다.

예를 들어, C++의 어느 시점에서 250 개의 필드가있는 객체에서 몇 개의 멤버 데이터를 평가할 수 있습니다. 그 객체를 루아에게 넘기고 싶다면 생성 된 SWIG 래퍼를 사용하여 객체를 조작하고 특정 필드를 표시 한 다음 (잠재적으로 변경된) 객체를 C++로 전달하여 계속 사용할 수있게하고 싶습니다. .

또한 래퍼를 사용하여 개체의 인스턴스를 인스턴스화하고이를 C++에 전달하여 개체의 일반적인 C++ 버전으로 사용할 수 있기를 바랍니다.

이것이 가능합니까? 누군가가 튜토리얼이나 명시적인 예제를 가르쳐 줄 수 있습니까?

도움을 주셔서 감사합니다.

답변

1

Swig 인터페이스 (Swig-Lua API에 대한 문서는 here 참조)를 사용하여 사용자 정의 유형을 감싸는 한 상호 작용이 원활해야합니다. 제공된 Swig 래퍼를 사용하면 새로운 객체를 인스턴스화하고 C++로 그 객체를 전달할 수 있습니다.

Swig-Lua 랩핑이 디렉터 클래스를 아직 지원하지 않는다고 생각합니다. 즉, 기존 클래스를 확장하고 인스턴스화하고 C++로 다시 전달할 수 없다는 의미입니다. 디렉터는 Python, Java, C#과 같은 언어에서 지원됩니다.

+0

링크를 사용해 주셔서 감사합니다. 일방 통행이라 할지라도 큰 도움이됩니다. 루아에서 객체의 새로운 인스턴스를 만들고 다시 C++로 전달할 수 없다하더라도 루아에 전달 된 기존 C++ 객체를 * 수정할 수 있는지 알고 있습니까? 즉, C++ 객체를 만들어 루아에 전달하고 루아에서 두 개의 필드를 변경 한 다음 C++에서 업데이트 된 필드를 사용하여 다시 시작할 수 있습니까? – zslayton

+0

물론 그렇습니다. SWIG에서 제공하는 인터페이스를 통해 LUA에서 객체를 수정하면 실제로 기본 C++ 객체가 수정됩니다. 모든 것이 아주 매끄럽게 진행됩니다. SWIG는 배열, STL, 포인터, 팩토리 형 함수 및 연산자 기반 클래스 인터페이스 (스마트 포인터 포함)와 같은 언어 기능으로도 훌륭하게 작동합니다. – ASk

0

swig가 문제를 일으키는 경우, 최신 버전의 tolua ++를 사용해 보았습니다.이 라이브러리는 C++ 및 Lua를 바인딩 할 목적으로 만 사용됩니다. 수정 된 .h 파일을 입력해야합니다. 약간 지루하지만 Swig의 모듈 이상은 아닙니다. 나는 다른 것보다 하나를 선호 할 아무 이유도 없지만, 둘 다 알고있는 것이 좋다.

0

Luabind도 확인해야합니다. 이것은 하나의 OOP for Lua를 구현하고 클래스와 데이터 타입을 루아에서 C++로 다시 매핑 할 수 있습니다.