问题描述
其实仍然是很简单的编译问题,但是又弄了一整个下午加几乎整个晚上,进度缓慢,又吸取了教训,因而还是来记录一下。
在试图使用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月啊,大难不死,必有后福,现在先努力不死吧!