Protobuf c++ 版链接失败
目录
1 环境
1.1 New
Raspbian 11
g++ 10.2.1
protobuf-cpp-3.19.3
1.2 Old
Raspbian 10
g++ 8.xxx(具体忘了)
protobuf-cpp-3.17.3
2 具体问题
在旧系统能正常编译链接的文件,到新系统中能正常编译,但链接失败,提示「undefined reference to `google::protobuf::xxxx`」。
3 排查
一开始以为是 protobuf 的动态库有问题,于是用回旧的版本重新编译,但结果还是一样。
之后怀疑有没可能是 protobuf 编译时「-std=c++xxx」版本对不上的原因,指定版本重新编译后,结果还是一样。
之后尝试直接安装 libprotobuf-dev 和 protobuf-compiler ,Makefile 删除相关的指定路径,结果还是一样。
没想到其他办法了,按照 Protocol Buffer Basics: C++ 写一个测试工程。期间从 g++ main.cc
开始,根据报错逐渐向后添加参数。 到链接那一步也没问题。将之前写的 proto 文件拿过来编译,也没问题。
很懵。
之后对照两个 Makefile ,看是否加了什么参数导致报错。结果,编译链接都正常。。。
想砸电脑。
最后,注意到两个 Makefile g++ 的参数顺序不同。(有点无语,谁会想到参数顺序能影响命令执行的)
之前习惯将参数放在链接文件之前:
g++ -L../protobuf/lib -lprotobuf main.o test.pb.o
写测试工程的时候倒没这讲究:
g++ main.o test.pb.o -L../protobuf/lib -lprotobuf
之后将正式工程 Makefile 中的 -L -l
移到命令末尾,链接就正常了。。。