C++中Protobuf转JSON时找不到同目录FLATBUFFER_DEFINITION.proto文件求助
解决Protobuf转JSON时找不到
.proto文件的问题 我之前也碰到过一模一样的坑,明明文件和可执行文件放一块了,程序就是找不到。大概率是路径解析或者工作目录的问题,给你几个排查和解决的方向:
先确认程序的当前工作目录不是可执行文件所在目录
很多时候我们双击运行程序时,系统的当前工作目录并不是exe所在的文件夹(比如Windows下可能是你的用户文档目录,Linux下可能是你的home目录)。你可以在代码里加一行打印当前工作目录的代码验证:- C++示例:
#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main(int argc, char* argv[]) { std::cout << "Current working dir: " << fs::current_path() << std::endl; // 其他代码... } - Python示例:
import os print("Current working dir:", os.getcwd())
如果打印出来的路径和你的exe目录不一致,那就是问题根源了。
- C++示例:
改用绝对路径加载
.proto文件
不要依赖相对路径,直接在代码里拼接可执行文件的目录和proto文件名,确保程序能精准找到文件:- C++示例:
std::string exe_dir = fs::canonical(fs::path(argv[0])).parent_path().string(); std::string proto_file_path = exe_dir + "/FLATBUFFER_DEFINITION.proto"; // 用这个绝对路径去加载proto文件 - Python示例:
import os exe_dir = os.path.dirname(os.path.abspath(__file__)) proto_file_path = os.path.join(exe_dir, "FLATBUFFER_DEFINITION.proto")
- C++示例:
检查文件名大小写和拼写
如果是在Linux/macOS系统上运行,文件名是严格区分大小写的。确认你代码里写的文件名和实际文件名完全一致(比如是不是把FLATBUFFER_DEFINITION.proto写成了flatbuffer_definition.proto?)验证文件权限和存在性
手动去可执行文件所在目录确认文件真的存在,并且程序有读取权限:- Windows:右键文件→属性,确保没有被设置为只读,且当前用户有读取权限
- Linux/macOS:用
ls -l FLATBUFFER_DEFINITION.proto查看权限,确保当前用户有读权限(权限位有r)
如果用的是
protoc命令行工具,记得指定proto搜索路径
如果你是通过protoc命令来转换Protobuf到JSON,必须用--proto_path(或-I)参数指定proto文件的搜索目录,比如:protoc --proto_path=. --json_out=./output FLATBUFFER_DEFINITION.proto这里
--proto_path=.告诉protoc在当前目录找proto文件。
内容的提问来源于stack exchange,提问作者Franconet
相关产品推荐
相关产品推荐

