問題描述
其實仍然是很簡單的編譯問題,但是又弄了一整個下午加幾乎整個晚上,進度緩慢,又吸取了教訓,因而還是來記錄一下。
在試圖使用torcharrow
進行推薦系統模擬的時候,撰寫的python
程序報錯:ERROR: flag 'flagfile' was defined more than once
。這是一個符號重復定義的問題,似乎在python
編程中非常常見。
總結一下問題解決的步驟:
首先排查哪一句開始報錯,一般是import
就會報這個error
,找到發現是自己寫的一個pybind11
的自用的共享庫,其中使用了gflags
和brpc
因而報錯。
然后得分析原因,其實已經講的很清楚了,符號重定義。所以無腦谷歌搜ai
問都沒卵用的。純浪費時間,還得先想想。
原因是pip install torcharrow
時,其實也他也打包了一個叫_torcharrow.xxx
類似這個名字的pybind
的共享庫,里面的lib
中也能看到兩個libgflags.so.xxx
這樣的文件,因此如果同時import
就重定義了符號,造成編譯失敗。具體torcharrow
的結構可以通過pip show torcharrow
去對應文件夾查看。
之前我的libflags
是靜態庫,所以需要重新編譯成動態庫,而且需要讓torcharrow
和我的共享庫使用同一個libgflags.so
,如此動態鏈接時只需要加載一份.so
,所以不會沖突,這就是動態庫的好處。
然而這里一定注意兩遍的libgflags
的版本要一致,torcharrow
是2.2.2
,這個庫好像都停止維護了,應該一直都會是這個版本了,所以就本機編譯安裝相同的版本。然后通過進入對應conda
的site-package/torcharrow.libs/
應該類似這樣的文件夾,將其中一個libgflags.so.xxx
通過軟鏈接ln -s
改成你本機編譯的那個.so
,他似乎有好幾個libgflags
,你可以先去site-package/torcharrow
用ldd
查看他的pybind
生成的動態庫需要的是哪個libgflags
,再去對應的地方軟鏈接修改。
就大功告成了。
還是動腦太少,人工智能時代,仍然應該優先自己分析問題,試圖解決。不行的話再求助。編譯的理解仍然需要加強。
近期諸事不順,眼睛花粉過敏,鼻子鼻竇炎又急性過敏性鼻炎,牙齒有一顆亟待根管,還有兩顆牙齦發炎只能先靠布洛芬維持生計,下周才掛到口腔科的號。唉!命途多舛的 3 3 3月啊,大難不死,必有后福,現在先努力不死吧!