日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

主c++ 辅lua luabind protobuf

發布時間:2025/3/21 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 主c++ 辅lua luabind protobuf 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

centos平臺下


lua-5.1.5(!!!!luabind0.9.1不能支持更高版本的lua。。。)

make linux;? 一堆提示libreadline.so的錯誤

由于lua編譯依賴readline庫,而其依賴ncurses庫,但沒有指定,所以出現“未定義的符合引用”錯誤。需要修改${LUA_DIR}/src/Makefile中linux編譯target,在SYSLIBS變量中追加‘-lncurses’選項即可。修改后,如下:linux:$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"


注意, 不是Makefile, 而是src/Makefile。 from:http://blog.csdn.net/sryan/article/details/18033455

make? install

cd src && install -p -m 0755 lua luac /usr/local/bin cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include cd src && install -p -m 0644 liblua.a /usr/local/lib cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1




boost.build(或許可以直接使用boost目錄下的bjam或者b2)

cd jam_src; sh build.sh; cp bin/bjam /usr/local/bin/;? mkdir /usr/share/boost-build; cp -r ../*? /usr/share/boost-build/;


export BOOST_ROOT=...(boost根目錄)

export LUA_PATH=/usr/local?? (注意,lua的頭文件在/usr/local/include/下)

bjam --prefix=/usr/local/luabind --toolset=gcc link=static runtime-link=static threading=multi stage debug

bjam --prefix=/usr/local/luabind --toolset=gcc link=static runtime-link=static threading=multi stage release

mkdir -p /usr/local/luabind/include /usr/local/luabind/lib

cp -rf luabind /usr/local/luabind/include/

cp -rf stage/* /usr/local/luabind/lib



簡單測試:Scene.h, main.cpp, map.lua

Scene.h

#pragma once #include <string> #include <iostream> #include <vector> extern "C" { #include <lua.h> #include <lualib.h> } #include <luabind/luabind.hpp>class Scene{public:Scene(){}void createObject(int obj);void printObjects();void loadMap(std::string fileName);private:std::vector<int> mObjects;};void Scene::createObject( int obj ){mObjects.push_back(obj);}void Scene::printObjects(){for (std::vector<int>::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)std::cout << (*iter) << std::endl;}void Scene::loadMap( std::string fileName ){try{using namespace luabind;lua_State* L = lua_open();luaL_openlibs(L);luabind::open(L);// 導出類Scene ?module(L)[// 導出的類名字不必與C++中的一樣 ?// 方法也是這樣 ?// 但是為了看著方便 ?// 我讓它們名稱都一樣了 ?class_<Scene>("Scene").def(luabind::constructor<>()).def("createObject", &Scene::createObject).def("printObject", &Scene::printObjects)// 注意到我并沒有導出loadMap()方法 ?];// 加載lua文件 ?luaL_dofile(L, fileName.c_str());// 調用lua文件中的createScene方法 ?luabind::call_function<void>(L, "createScene", this);}catch (luabind::error& e){std::cout << e.what() << std::endl;}}

main.cpp

#include "Scene.h" #include <unistd.h> #include <stdlib.h>int main(){Scene s;s.loadMap("map.lua");s.printObjects();return 0;}
map.lua

- map.lua function createScene( scene )for i=0, 10 doscene:createObject(i)endend

build:

g++ -g -o test main.cpp -I/usr/local/luabind/include/ -I/usr/local/include/? /usr/local/lib/liblua.a /usr/local/luabind/lib/libluabind.a -ldl


-----new main

#include "Scene.h" #include <unistd.h> #include <stdlib.h> #include <iostream> using namespace std;void testFunc(int k) {cout<<"hello there, i am a cpp fun"<<endl;cout<<"input num:="<<k<<endl; }int main() { <span style="color:#FF0000;">using namespace luabind;lua_State* L = luaL_newstate();luaopen_base(L);luabind::open(L);module(L, "cppapi")[def("testFunc", (void(*)(int))testFunc)];luabind::module(L) [ // 導出的類名字不必與C++中的一樣 // 方法也是這樣 // 但是為了看著方便 // 我讓它們名稱都一樣了 class_<Scene>("Scene") .def(luabind::constructor<>()) .def("createObject", &Scene::createObject) .def("printObject", &Scene::printObjects) // 注意到我并沒有導出loadMap()方法 ]; </span>Scene s; <span style="color:#FF0000;">// 加載lua文件 luaL_dofile(L, "map.lua"); // 調用lua文件中的createScene方法 luabind::call_function<void>(L, "createScene", &s); luabind::call_function<void>(L, "createScene", &s); //調用兩次</span>s.printObjects(); return 0;}

protoc-gen-lua

下載、解壓

1)到protobuf目錄下, make。 Makefile中使用了pkg-config, 但是lua5.1似乎不支持;因此直接將相關的替換成頭文件或者lib文件所在目錄就行。得到pb.so

2)plugin目錄下, 編寫 protoc-gen-lua.sh, 如下:

#!/bin/bashcur=`dirname $0` python $cur/protoc-gen-lua然后增加protoc-gen-lua, protoc-gen-lua.sh的x權限, 都拷貝到/usr/loca/bin/目錄下即可

3)到example目錄下, 執行:

protoc --proto_path=. --plugin=protoc-gen-lua=/usr/local/bin/protoc-gen-lua.sh --lua_out=./ ./person.proto 其中, --plugin是protoc的參數選項, 格式是NAME=VALUE。 并且VALUE要在可執行文件的searchpath下, 如/bin/, /usr/local/bin等; 本人放在了/usr/local/bin/下。 VALUE不能直接使用protoc-gen-lua文件, protoc中最終是通過execv(VALUE, argv)執行的, 直接傳protoc-gen-lua(實際是個python腳本)一直不成功。



c++利用lua實現業務邏輯(主要是修改protobuf類的對象)

1) 綁定protobuf類及其暴漏的public函數到lua中; 在lua腳本中寫代碼的流程方式與在c++寫代碼基本一樣。

2)不綁定protobuf類及其函數,因為這樣比較繁瑣(使用代碼可以實現程序自動綁定); 因此,將protobuf skema翻譯成lua類/表?、以及提供與c++/python等一致的序列化/反序列化機制。c++傳遞string給lua, lua函數收到后ParseFromString得到lua類,然后再實現業務邏輯; 最后將新對象序列化為string返回給c++。

----lua 新手, 第二種方式總是出錯,待查中。

---------continue -------------------------

</pre><pre name="code" class="cpp">//c++ string str; p.set_id(1001); if(p.SerializeToString(&str)) { //TODO, lua內的string類型是TString; 也許modify_string的參數和返回值都是TString, 然后直接lua_bind就成? 暫且不行, 因為lua庫和頭文件沒有暴露TStringlua_getglobal(L, "modify_string");//函數到棧頂lua_pushlstring(L, str.c_str(), str.size());//參數壓棧lua_pcall(L, 1, 2, 0);int len = lua_tonumber(L, -2);//獲取兩個返回值。const char *csr = lua_tostring(L, -1);string s2(csr, len);cout <<"s2 .lenght: " << len << endl;Person newp;newp.ParseFromString(s2);cout <<"after modified by lua: id=" << newp.id() << endl; //1889 here... }--lua local person_pb = require "person_pb" local string = stringfunction modify_string(str)local person = person_pb.Person()person:ParseFromString(str)person.id = person.id + 888 local newstr = person:SerializeToString()return string.len(newstr), newstr end--Makefile CXX???????????????????????????? := g++ OPT???????????????????????????? := -g -ggdb -Wall CXXFLAGS??????????????? += -I./? -I/usr/local/include -I/usr/local/luabind/include/ -I/usr/local/include/ -L. CXXFLAGS??????????????? += $(OPT) LDFLAGS???????????????? := SHARED_LDFLAGS? := -shared SHARED_CFLAGS?? := -fPIC LIBS??????????????????? := -lprotobuf -ldl -lpbSRCEXTS???????????????? := .cpp .cc .cxx ##change you want SRCDIRS???????????????? := ./SRCS??????????????? := OBJS??????????????????? := DEPS??????????????????? :=BINARY????????????????? = testSRCS??????????????? := $(foreach d, $(SRCDIRS), $(wildcard $(addprefix $(d)/*, $(SRCEXTS)))) OBJS??????????????????? := $(foreach x, $(SRCEXTS), $(patsubst %$(x), %.o, $(filter %$(x), $(SRCS)))) DEPS??????????????????? := $(patsubst %.o, %.d, $(OBJS))all: $(BINARY) $(BINARY):$(OBJS) ifeq ($(strip $(SRCEXTS)), .c)$(CC) $(CFLAGS) -o $(BINARY) $^ $(LDFLAGS) $(LIBS) else$(CXX) $(CXXFLAGS) -o $(BINARY) $^ $(LDFLAGS) $(LIBS) /usr/local/lib/liblua.a /usr/local/luabind/lib/libluabind.a endifobj:$(OBJS)%.o:%.c$(CC) $(CFLAGS) -c -o $@ $< %.o:%.cpp$(CXX) $(CXXFLAGS) -c -o $@ $< %.o:%.cc$(CXX) $(CXXFLAGS) -c -o $@ $< %.o:%.cxx$(CXX) $(CXXFLAGS) -c -o $@ $<clean:rm -rf *.o $(BINARY)








總結

以上是生活随笔為你收集整理的主c++ 辅lua luabind protobuf的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。