biglink脚本基本上从build/objects/*so.o中找到的所有内容创建一个库
但是zope对象有时会定义相同的符号,例如,这是
_IFBTree.c
:
/* IFBTree - int key, float value BTree
Implements a collection using int type keys
and float type values
*/
/* Setup template macros */
#define PERSISTENT
#define MOD_NAME_PREFIX "IF"
#define DEFAULT_MAX_BUCKET_SIZE 120
#define DEFAULT_MAX_BTREE_SIZE 500
#include "_compat.h"
#include "intkeymacros.h"
#include "floatvaluemacros.h"
#ifdef PY3K
#define INITMODULE PyInit__IFBTree
#else
#define INITMODULE init_IFBTree
#endif
#include "BTreeModuleTemplate.c"
和
_IIBTree.c
:
/* IIBTree - int key, int value BTree
Implements a collection using int type keys
and int type values
*/
/* Setup template macros */
#define PERSISTENT
#define MOD_NAME_PREFIX "II"
#define DEFAULT_MAX_BUCKET_SIZE 120
#define DEFAULT_MAX_BTREE_SIZE 500
#include "_compat.h"
#include "intkeymacros.h"
#include "intvaluemacros.h"
#ifdef PY3K
#define INITMODULE PyInit__IIBTree
#else
#define INITMODULE init_IIBTree
#endif
#include "BTreeModuleTemplate.c"
如您所见,两者都包括
BTreeModuleTemplate.c
,因此,如果将生成的.o文件合并在一起,函数之间的名称冲突是不可避免的。
在这种情况下,可以从生成的库中排除冲突对象:
diff --git a/src/tools/biglink b/src/tools/biglink
index 1f82d18..7b05fb5 100755
--- a/src/tools/biglink
+++ b/src/tools/biglink
@@ -7,9 +7,24 @@ import subprocess
sofiles = [ ]
+blacklist = [
+ '_LOBTree.so', '_LLBTree.so', 'cPersistence.so', '_zope_', 'cPickleCache.so',
+ '_LFBTree.so', '_OOBTree.so', '_IIBTree.so', '_OLBTree.so', '_IFBTree.so',
+ '_IOBTree.so', '_fsBTree.so',
+]
+
+def is_blacklisted(fn):
+ for name in blacklist:
+ if fn.startswith(name):
+ return True
+ return False
+
+
for directory in sys.argv[2:]:
for fn in os.listdir(directory):
+ if is_blacklisted(fn):
+ continue
fn = os.path.join(directory, fn)
if not fn.endswith(".so.o"):