Blue Gene机器上的“跳过不兼容”

时间:2011-10-26 02:16:01

标签: architecture compiler-construction compatibility powerpc kyotocabinet

我正在尝试在Blue Gene超级计算机上构建Google Protocolbuffers和Kyotocabinet,这是一台基于PowerPC64的计算机,运行Suse Linux,gcc 4.1.2。

当我编译我的代码时,Google Protocolbuffers和Kyotocabinet都给出了“跳过不兼容”的错误。 编译命令行:

g++ -g -Xlinker -zmuldefs -I/some_path/include $sourceFile -o $fileName -L/some_path/lib -lkyotocabinet -lz -lstdc++ -lrt -lpthread -lm -lc -lprotobuf -lprotoc meta.pb.cc

然后我改变了它们的安装,使用./configure --host=powerpc-bgp-linux,这次Google Protocolbuffers正常工作,但是Kyotocabinet仍然给出了如下错误:

/usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.so when searching for -lkyotocabinet
/usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.a when searching for -lkyotocabinet
/usr/bin/ld: cannot find -lkyotocabinet
collect2: ld returned 1 exit status

我检查了config.status他们,Google Protocolbuffers有这样的事情

sys_lib_search_path_spec='/usr/lib/gcc/powerpc64-suse-linux/4.1.2 /usr/powerpc64-suse-linux/lib /usr/lib /lib'

显然它知道如何找到合适的东西来使用。但是Kyotocabinet在config.status中没有这种设置。希望这个提示有所帮助。

有没有解决方案所以我可以在BlueGene上使用Kyotocabinet?或者我可以添加一些如上所述的行来告诉Kyotocabinet在哪里找到正确的lib?或者你能推荐一些快速键值存储吗?

1 个答案:

答案 0 :(得分:2)

你的问题不是找到Kyotocabinet。您的问题是您指向的库:/some_path/lib/libkyotocabinet.so是为不兼容的体系结构而构建的(最常见的ppc32)。

执行file -L /some_path/lib/libkyotocabinet.so并查看其内容。您必须重建它,使其与gcc默认生成的体系结构相同。

更新:fileELF 64-bit MSB shared object, 64-bit PowerPC。但这是否与默认情况下g++输出相匹配?输出是什么:

echo "int foo() { return 0; }" | g++ -xc++ - -c -o foo.o &&
file foo.o

我在上面打赌将打印32-bit PowerPC,在这种情况下,您需要将-m64添加到命令行。

更新2:

  

对这个问题有任何想法吗?

你不应该这么无助。您了解问题是库不匹配,因此请修复它。

  1. 决定是否要让最终二进制文件以32位或64位模式运行
  2. 获取或重建所需的所有图书馆
  3. 构建最终二进制文件
  4. 利润!