Protobuf c++ 版鏈接失敗
目錄
1 環(huán)境
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 具體問(wèn)題
在舊系統(tǒng)能正常編譯鏈接的文件,到新系統(tǒng)中能正常編譯,但鏈接失敗,提示「undefined reference to `google::protobuf::xxxx`」。
3 排查
一開(kāi)始以為是 protobuf 的動(dòng)態(tài)庫(kù)有問(wèn)題,于是用回舊的版本重新編譯,但結(jié)果還是一樣。
之后懷疑有沒(méi)可能是 protobuf 編譯時(shí)「-std=c++xxx」版本對(duì)不上的原因,指定版本重新編譯后,結(jié)果還是一樣。
之后嘗試直接安裝 libprotobuf-dev 和 protobuf-compiler ,Makefile 刪除相關(guān)的指定路徑,結(jié)果還是一樣。
沒(méi)想到其他辦法了,按照 Protocol Buffer Basics: C++ 寫(xiě)一個(gè)測(cè)試工程。期間從 g++ main.cc
開(kāi)始,根據(jù)報(bào)錯(cuò)逐漸向后添加參數(shù)。 到鏈接那一步也沒(méi)問(wèn)題。將之前寫(xiě)的 proto 文件拿過(guò)來(lái)編譯,也沒(méi)問(wèn)題。
很懵。
之后對(duì)照兩個(gè) Makefile ,看是否加了什么參數(shù)導(dǎo)致報(bào)錯(cuò)。結(jié)果,編譯鏈接都正常。。。
想砸電腦。
最后,注意到兩個(gè) Makefile g++ 的參數(shù)順序不同。(有點(diǎn)無(wú)語(yǔ),誰(shuí)會(huì)想到參數(shù)順序能影響命令執(zhí)行的)
之前習(xí)慣將參數(shù)放在鏈接文件之前:
g++ -L../protobuf/lib -lprotobuf main.o test.pb.o
寫(xiě)測(cè)試工程的時(shí)候倒沒(méi)這講究:
g++ main.o test.pb.o -L../protobuf/lib -lprotobuf
之后將正式工程 Makefile 中的 -L -l
移到命令末尾,鏈接就正常了。。。