如何让 Google Protobuf 在 Matlab 中工作?
How to get Google Protobuf working in Matlab?
因此,如果想在 Matlab 中使用 Google 协议缓冲区并使用 Windows 计算机,最好的方法是什么,因为 Matlab 不在支持的语言列表中?
我还没有看到这方面的答案,我认为解决方案有点晦涩,所以我打算 post 如何使用 protoc.exematlab_out
如何将 google 协议缓冲区 matlab 输出,这是使用来自互联网的资源我还将包含一个包含所有这些已经完成的 zip 文件。
解压protobuf-‘version#’.zip(貌似:protobuf-#.#.#)
打开文件protobuf-#.#.# -> src
- 选择你喜欢的编辑器(Notepad++很好)并更改Makefile.am(不包括引号)
一个。在“nobase_include_HEADERS =
”下
及以下“$(GZHEADERS)
”
添加行“farsounder/protobuf/compiler/matlab/matlab_generator.h \
”(注意反斜杠)
b。在“libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
”下
添加行
“farsounder/protobuf/compiler/matlab/matlab_generator.cc \
”
“farsounder/protobuf/compiler/matlab/matlab_plugin.cc \
”
c。保存文件并退出
- 仍然在 src 目录中进入 ->google ->protobuf->compiler 并更改 main.cc
一个。在“#include <google/protobuf/compiler/java/java_generator.h>
”下
添加行“#include <farsounder/protobuf/compiler/matlab/matlab_generator.h>
”
b。在主函数中添加行
“// Proto2 Matlab
farsounder::protobuf::compiler::matlab::MatlabGenerator matlab_generator;
cli.RegisterGenerator("--matlab_out", &matlab_generator,
"Generate Matlab M files.");
”
c。保存文件并退出
- 解压 protobuf-matlab
- 打开文件protobuf-matlab ->src,复制farsounder目录到protobuf-#.#.# ->src目录
- 返回 protobuf-#.#.# 目录并进入 -> vsprojects 并在 Visual Studio 中打开 protobuf.sln,我相信任何版本都应该可以工作
- 应该有一个弹出窗口想要将解决方案文件转换为更新版本,继续这样做
- 如果您没有看到解决方案资源管理器,请使用 ctrl+alt+L 打开它
- 打开一个新的 windows 资源管理器并进入 protobuf-#.#.# ->src->farsounder->protobuf->compiler->matlab,现在在 visual studio 使用解决方案explorer 展开 libprotoc->Header Files,现在在 windows explorer 复制 matlab_generator.h 文件并粘贴到 Header Files 目录
- 仍然在解决方案资源管理器中进入源文件目录并复制到 matlab_generator.cc
- 合同libprotoc并右键单击protoc并单击属性
- 在 Configuration Properties->Linker->General 下,将 Enable Incremental Linking 编辑为 No
- 在Configuration Properties->Linker->Input下,编辑Additional Dependencies
一种。在“Release\libprotoc.lib”下方添加行“Release\libprotobuf.lib”
b.单击 Additional Dependencies window 上的 OK 和 protoc 属性 Page
上的 OK
- 将构建类型更改为 Release
- 右键单击 libprotobuf 并 select 构建,完成后右键单击 libprotoc 并 select 构建
- 一旦完成右键单击 protoc 和 select 构建,它应该会在 protobuf-#.#.# ->vsprojects->Release 下为您提供一个 protoc.exe,现在这将允许您可以使用 matlab_out 命令
创建 matlab .m 文件
帮忙找protobuf-#.#.#和protobuf-matlab:
点击这些链接:
https://code.google.com/p/protobuf-matlab/source/browse/
下载 zip 文件
https://github.com/google/protobuf/releases
下载源代码
额外帮助,使用 protoc.exe
- 将创建的 protoc.exe 复制并粘贴到您的 .proto 文件所在的位置
- 运行 命令并将目录更改为 protoc.exe 和 .proto 文件所在的目录
- 运行 这个命令(假设我的 .proto 文件的名称是“afunprotofile”)“
protoc –matlab_out=./ -I./ afunprotofile.proto
”
最简单的方法是使用Java
FarSounder 代码很好,但它很旧且无人维护。生成 Matlab 兼容代码的最简单方法是仅使用 Java 版本的 Protobuf。此解决方案应适用于支持 Matlab 和 Java.
的任何平台
台阶
- 创建 .proto 文件
- 使用
protoc
编译器处理文件并输出Java源
- 使用 IntelliJ 或其他工具生成包含依赖项的 JAR 文件
- 将 JAR 文件添加到 Matlab class路径。
edit('classpath.txt')
- 重新启动 Matlab
protobuf 运行时依赖项
我将它们包含在 Protobuf 和两个运行时库的单个 JAR 文件输出中。
- protobuf-java-3.3.0.jar
- protobuf-java-util-3.3.0.jar
一个样本
我写了一个简单的 Java 包装器 class 来隐藏我添加到 JAR 文件的来自 Matlab 的 MyProtobuf.Builder
return 类型
public class MyProtobufWrapperWrapper {
public static MyProtobuf.Builder newBuilder()
{
return MyProtobuf.newBuilder();
}
}
在 Matlab 中
p = com.cameronpalmer.MyProtobufWrapper.newBuilder();
p.setIdentifier(java.util.UUID.randomUUID().toString());
p.setTimestampMilliseconds(timestamp);
p.setAngleRadians(0);
p.addAllChannelSamples(channel_vector);
planeWaveBuilt = p.build();
byteArray = planeWaveBuilt.toByteArray();
正如 Cameron Lowell Palmer 的回答所暗示的那样,要走的路是 Java。
我今天在这个问题上浪费了几个小时,我想详细说明一下。我从 Cameron 的回答开始,但我不得不再做几个步骤。本质上,我必须执行以下所有操作:
- 编译 java 的原型消息,例如
protoc --java_out=./ your_file.proto
- 记得安装protobuf java运行时,例如在 ubuntu 中:
sudo apt install libprotobuf-java
- 在您的系统上找到 protobuf java 运行时,例如:
/usr/share/java/protobuf-3.6.1.jar
;稍后将使用它的路径。名称应始终遵循 protobuf-version.jar
或 protobuf-java-version.jar
模式,因此 locate protobuf- | grep jar$
应为您减少搜索 space。
- 将一个简短的 java 文件添加到您的 protobuf java 文件所在的同一目录 (
./x/y/z/MyProto.java
)。使用您的包路径而不是 x/y/z。如果你没有在 proto 文件中明确声明 java 包,那么 protoc 只会使用你的文件名作为包名。无论哪种方式,您都可以自己检查 protoc 生成的文件去了哪里。 MyProto.java 的内容如下所示。只需用您的东西替换 YourProtoFileName
和 YourMessageName
即可。请注意,此步骤不是可选的,因为这不会生成简单的助手 class。对于我的生活,Matlab 不会让我直接使用内部 classes(在 java 中,YourMessageName
是 YourProtoFileName
的内部 class。但是有了上面的帮手,很高兴为我生成它们。请注意,如果您在 proto 文件中定义了多个消息,您可能需要以这种方式公开多个构建器。如果您只需要读取 protobuffers,那么您可能只需要导出 YourMessageName
而不是 Builder
.
package x.y.z;
import x.y.z.YourProtoFileName; // if you do not know it, do `ls x.y.z/*.java`
public class MyProto {
public static YourProtoFileName.YourMessageName.Builder newBuilder() {
return YourProtoFileName.YourMessageName.newBuilder();
}
}
- 查看Matlab的版本java;在 Matlab 中写
version -java
。在我的例子中,它是 1.8,而我的系统 (java -version
) 上安装的默认 java 是 11。下一步我必须手动 select java 1.8,否则整件事没有奏效。更糟糕的是,Matlab 只产生了一个非常难以描述的错误 "No class x.y.z.YourProtoFileName." 感谢 Matlab!您可能需要先安装正确的版本 (sudo apt install openjdk-8-jdk
),然后使用 update-java-alternatives
或在您的系统上找到 javac
以找到合适的 java 版本。
- 编译您的 java 文件和 protoc 生成的文件。请记住将 classpath 指向您在上面找到的 jar 文件或 protobuffer 运行时。并记住使用您的 javac 路径。在单个命令中:
/usr/lib/jvm/java-8-openjdk-amd64/bin/javac x.y.z/*.java -cp /usr/share/java/protobuf-3.6.1.jar
。这将在 ./x/y/z/
. 中生成 class 个文件
- 可选:将 class 文件打包到 jar 中以便于分发:
jar cvf ./YourProtoFilename.jar x/y/z/*.class
。请注意,此命令行适用于我,因为我已将所有 classes(包括 MyProto)放在同一个包中。您可能需要根据自己的需要对其进行调整。
- 启动 Matlab。
% make Matlab aware of your new classes
javaaddpath('./')
% tell Matlab where protobuf dependancy lives (use the path from step 3)
javaaddpath('/usr/share/java/protobuf-3.6.1.jar')
% test if the classes were found
methods('x.y.z.YourProtoFilename.YourMessageName')
% if methods are listed then you are good to go
% use the helper form step 4
b = x.y.z.MyProto.newBuilder();
% now you have a builder you can use to build your protobuf message
- 请参阅 Google 的 protobuf java primer 从这里继续,因为在 Matlab 中使用 java 非常简单:只需编写 java 语句。只要它们是简单的语句:)
同样的程序也适用于八度。八度内的 java 语法有点不同。在我的例子中,octave 对 java 版本不那么挑剔。 YMMV
@WPFUser,
We followed below steps to build protoc for matlab.
1) git clone https://github.com/protocolbuffers/protobuf.git to protobuf-main folder
2) git submodule update --init --recursive
3) git clone https://github.com/farsounder/protobuf-matlab.git - protobuf_matlab folder
4) Copied src folder from protobuf_matlab repo to protobuf-main/src
5) Updated cmake/libprotoc.cmake to include matlab_generator.cc and matlab_generator.h files
6) Updated cmake/extract_includes.bat.in to include matlab_generator.h file
7) \src\google\protobuf\compiler\main.cc to include matlab_generator
因此,如果想在 Matlab 中使用 Google 协议缓冲区并使用 Windows 计算机,最好的方法是什么,因为 Matlab 不在支持的语言列表中?
我还没有看到这方面的答案,我认为解决方案有点晦涩,所以我打算 post 如何使用 protoc.exematlab_out
如何将 google 协议缓冲区 matlab 输出,这是使用来自互联网的资源我还将包含一个包含所有这些已经完成的 zip 文件。
解压protobuf-‘version#’.zip(貌似:protobuf-#.#.#)
打开文件protobuf-#.#.# -> src
- 选择你喜欢的编辑器(Notepad++很好)并更改Makefile.am(不包括引号)
一个。在“nobase_include_HEADERS =
”下
及以下“$(GZHEADERS)
”
添加行“farsounder/protobuf/compiler/matlab/matlab_generator.h \
”(注意反斜杠)
b。在“libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
”下
添加行
“farsounder/protobuf/compiler/matlab/matlab_generator.cc \
”
“farsounder/protobuf/compiler/matlab/matlab_plugin.cc \
”
c。保存文件并退出
- 仍然在 src 目录中进入 ->google ->protobuf->compiler 并更改 main.cc
一个。在“#include <google/protobuf/compiler/java/java_generator.h>
”下
添加行“#include <farsounder/protobuf/compiler/matlab/matlab_generator.h>
”
b。在主函数中添加行
“// Proto2 Matlab
farsounder::protobuf::compiler::matlab::MatlabGenerator matlab_generator;
cli.RegisterGenerator("--matlab_out", &matlab_generator,
"Generate Matlab M files.");
”
c。保存文件并退出
- 解压 protobuf-matlab
- 打开文件protobuf-matlab ->src,复制farsounder目录到protobuf-#.#.# ->src目录
- 返回 protobuf-#.#.# 目录并进入 -> vsprojects 并在 Visual Studio 中打开 protobuf.sln,我相信任何版本都应该可以工作
- 应该有一个弹出窗口想要将解决方案文件转换为更新版本,继续这样做
- 如果您没有看到解决方案资源管理器,请使用 ctrl+alt+L 打开它
- 打开一个新的 windows 资源管理器并进入 protobuf-#.#.# ->src->farsounder->protobuf->compiler->matlab,现在在 visual studio 使用解决方案explorer 展开 libprotoc->Header Files,现在在 windows explorer 复制 matlab_generator.h 文件并粘贴到 Header Files 目录
- 仍然在解决方案资源管理器中进入源文件目录并复制到 matlab_generator.cc
- 合同libprotoc并右键单击protoc并单击属性
- 在 Configuration Properties->Linker->General 下,将 Enable Incremental Linking 编辑为 No
- 在Configuration Properties->Linker->Input下,编辑Additional Dependencies 一种。在“Release\libprotoc.lib”下方添加行“Release\libprotobuf.lib” b.单击 Additional Dependencies window 上的 OK 和 protoc 属性 Page 上的 OK
- 将构建类型更改为 Release
- 右键单击 libprotobuf 并 select 构建,完成后右键单击 libprotoc 并 select 构建
- 一旦完成右键单击 protoc 和 select 构建,它应该会在 protobuf-#.#.# ->vsprojects->Release 下为您提供一个 protoc.exe,现在这将允许您可以使用 matlab_out 命令 创建 matlab .m 文件
帮忙找protobuf-#.#.#和protobuf-matlab:
点击这些链接:
https://code.google.com/p/protobuf-matlab/source/browse/
下载 zip 文件
https://github.com/google/protobuf/releases
下载源代码
额外帮助,使用 protoc.exe
- 将创建的 protoc.exe 复制并粘贴到您的 .proto 文件所在的位置
- 运行 命令并将目录更改为 protoc.exe 和 .proto 文件所在的目录
- 运行 这个命令(假设我的 .proto 文件的名称是“afunprotofile”)“
protoc –matlab_out=./ -I./ afunprotofile.proto
”
最简单的方法是使用Java
FarSounder 代码很好,但它很旧且无人维护。生成 Matlab 兼容代码的最简单方法是仅使用 Java 版本的 Protobuf。此解决方案应适用于支持 Matlab 和 Java.
的任何平台台阶
- 创建 .proto 文件
- 使用
protoc
编译器处理文件并输出Java源 - 使用 IntelliJ 或其他工具生成包含依赖项的 JAR 文件
- 将 JAR 文件添加到 Matlab class路径。
edit('classpath.txt')
- 重新启动 Matlab
protobuf 运行时依赖项
我将它们包含在 Protobuf 和两个运行时库的单个 JAR 文件输出中。
- protobuf-java-3.3.0.jar
- protobuf-java-util-3.3.0.jar
一个样本
我写了一个简单的 Java 包装器 class 来隐藏我添加到 JAR 文件的来自 Matlab 的 MyProtobuf.Builder
return 类型
public class MyProtobufWrapperWrapper {
public static MyProtobuf.Builder newBuilder()
{
return MyProtobuf.newBuilder();
}
}
在 Matlab 中
p = com.cameronpalmer.MyProtobufWrapper.newBuilder();
p.setIdentifier(java.util.UUID.randomUUID().toString());
p.setTimestampMilliseconds(timestamp);
p.setAngleRadians(0);
p.addAllChannelSamples(channel_vector);
planeWaveBuilt = p.build();
byteArray = planeWaveBuilt.toByteArray();
正如 Cameron Lowell Palmer 的回答所暗示的那样,要走的路是 Java。
我今天在这个问题上浪费了几个小时,我想详细说明一下。我从 Cameron 的回答开始,但我不得不再做几个步骤。本质上,我必须执行以下所有操作:
- 编译 java 的原型消息,例如
protoc --java_out=./ your_file.proto
- 记得安装protobuf java运行时,例如在 ubuntu 中:
sudo apt install libprotobuf-java
- 在您的系统上找到 protobuf java 运行时,例如:
/usr/share/java/protobuf-3.6.1.jar
;稍后将使用它的路径。名称应始终遵循protobuf-version.jar
或protobuf-java-version.jar
模式,因此locate protobuf- | grep jar$
应为您减少搜索 space。 - 将一个简短的 java 文件添加到您的 protobuf java 文件所在的同一目录 (
./x/y/z/MyProto.java
)。使用您的包路径而不是 x/y/z。如果你没有在 proto 文件中明确声明 java 包,那么 protoc 只会使用你的文件名作为包名。无论哪种方式,您都可以自己检查 protoc 生成的文件去了哪里。 MyProto.java 的内容如下所示。只需用您的东西替换YourProtoFileName
和YourMessageName
即可。请注意,此步骤不是可选的,因为这不会生成简单的助手 class。对于我的生活,Matlab 不会让我直接使用内部 classes(在 java 中,YourMessageName
是YourProtoFileName
的内部 class。但是有了上面的帮手,很高兴为我生成它们。请注意,如果您在 proto 文件中定义了多个消息,您可能需要以这种方式公开多个构建器。如果您只需要读取 protobuffers,那么您可能只需要导出YourMessageName
而不是Builder
.
package x.y.z;
import x.y.z.YourProtoFileName; // if you do not know it, do `ls x.y.z/*.java`
public class MyProto {
public static YourProtoFileName.YourMessageName.Builder newBuilder() {
return YourProtoFileName.YourMessageName.newBuilder();
}
}
- 查看Matlab的版本java;在 Matlab 中写
version -java
。在我的例子中,它是 1.8,而我的系统 (java -version
) 上安装的默认 java 是 11。下一步我必须手动 select java 1.8,否则整件事没有奏效。更糟糕的是,Matlab 只产生了一个非常难以描述的错误 "No class x.y.z.YourProtoFileName." 感谢 Matlab!您可能需要先安装正确的版本 (sudo apt install openjdk-8-jdk
),然后使用update-java-alternatives
或在您的系统上找到javac
以找到合适的 java 版本。 - 编译您的 java 文件和 protoc 生成的文件。请记住将 classpath 指向您在上面找到的 jar 文件或 protobuffer 运行时。并记住使用您的 javac 路径。在单个命令中:
/usr/lib/jvm/java-8-openjdk-amd64/bin/javac x.y.z/*.java -cp /usr/share/java/protobuf-3.6.1.jar
。这将在./x/y/z/
. 中生成 class 个文件
- 可选:将 class 文件打包到 jar 中以便于分发:
jar cvf ./YourProtoFilename.jar x/y/z/*.class
。请注意,此命令行适用于我,因为我已将所有 classes(包括 MyProto)放在同一个包中。您可能需要根据自己的需要对其进行调整。 - 启动 Matlab。
% make Matlab aware of your new classes
javaaddpath('./')
% tell Matlab where protobuf dependancy lives (use the path from step 3)
javaaddpath('/usr/share/java/protobuf-3.6.1.jar')
% test if the classes were found
methods('x.y.z.YourProtoFilename.YourMessageName')
% if methods are listed then you are good to go
% use the helper form step 4
b = x.y.z.MyProto.newBuilder();
% now you have a builder you can use to build your protobuf message
- 请参阅 Google 的 protobuf java primer 从这里继续,因为在 Matlab 中使用 java 非常简单:只需编写 java 语句。只要它们是简单的语句:)
同样的程序也适用于八度。八度内的 java 语法有点不同。在我的例子中,octave 对 java 版本不那么挑剔。 YMMV
@WPFUser,
We followed below steps to build protoc for matlab.
1) git clone https://github.com/protocolbuffers/protobuf.git to protobuf-main folder
2) git submodule update --init --recursive
3) git clone https://github.com/farsounder/protobuf-matlab.git - protobuf_matlab folder
4) Copied src folder from protobuf_matlab repo to protobuf-main/src
5) Updated cmake/libprotoc.cmake to include matlab_generator.cc and matlab_generator.h files
6) Updated cmake/extract_includes.bat.in to include matlab_generator.h file
7) \src\google\protobuf\compiler\main.cc to include matlab_generator