使用g++将32位和64位.so文件链接到C ++程序中

4
我正在尝试为C++程序同时链接32位和64位的.so文件。 我使用的是64位Ubuntu 12.04.1,而且我没有源文件进行重新编译。
当我运行g++命令时:
g++ onlineTraining.cpp -I /usr/local/MATLAB/R2012a_Student/extern/include/ -L /home/forest/SoarSuite/out/ -L /usr/local/MATLAB/R2012a_Student/bin/glnx86/ -I /home/forest/SoarSuite/out/include -leng -lmat -lmex -lut -lSoar 由于它无法识别32位的.so文件,我得到了以下输出:
/usr/bin/ld: skipping incompatible /usr/local/MATLAB/R2012a_Student/bin/glnx86//libeng.so when searching for -leng /usr/bin/ld: cannot find -leng /usr/bin/ld: skipping incompatible /usr/local/MATLAB/R2012a_Student/bin/glnx86//libmat.so when searching for -lmat /usr/bin/ld: cannot find -lmat /usr/bin/ld: skipping incompatible /usr/local/MATLAB/R2012a_Student/bin/glnx86//libmex.so when searching for -lmex /usr/bin/ld: cannot find -lmex /usr/bin/ld: skipping incompatible /usr/local/MATLAB/R2012a_Student/bin/glnx86//libut.so when searching for -lut /usr/bin/ld: cannot find -lut collect2: ld returned 1 exit status
当我带上-m32选项再次运行g++命令时:
g++ -m32 onlineTraining.cpp -I /usr/local/MATLAB/R2012a_Student/extern/include/ -L /home/forest/SoarSuite/out/ -L /usr/local/MATLAB/R2012a_Student/bin/glnx86/ -I /home/forest/SoarSuite/out/include -leng -lmat -lmex -lut -lSoar 由于现在它无法识别64位的.so文件,我得到了以下输出:
/usr/bin/ld: skipping incompatible /home/forest/SoarSuite/out//libSoar.so when searching for -lSoar /usr/bin/ld: cannot find -lSoar /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so when searching for -lstdc++ /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a when searching for -lstdc++ /usr/bin/ld: cannot find -lstdc++ collect2: ld returned 1 exit status
请问是否有可能同时链接32位和64位的.so文件呢? 谢谢。

你为什么想要这样做? - user93353
@user93353 我正在使用一个C++程序在Matlab和一个名为SOAR的认知架构之间进行接口。我没有选择在我的电脑上做这件事,因为我只有Matlab的32位二进制文件和SOAR的64位二进制文件,并且我没有重新编译它们的源文件的选择。 - user1968703
2个回答

3
不,这是不可能的。32位库只能链接到32位可执行文件中,64位库只能链接到64位可执行文件中。
如果您要链接的Matlab库只有32位版本,则需要将您的应用程序构建为32位(使用-m32),并仅链接32位库。

好的,我就怕会这样。谢谢你的快速回复。 - user1968703

-1
我建议创建一个 shell 脚本或 makefile,以运行这两个编译器命令。

问题在问题描述中被描述为“尝试链接32位失败并且尝试链接64位也失败”,您提出的解决方案是“两者都做”。那怎么帮助呢? - us2012
@us2012,我回答了OP明确提出的问题,即如何链接某些代码的32位和64位版本。当然,在更仔细地查看输出后,我可以看到真正的问题应该是为什么在两种情况下都链接失败。 - Code-Apprentice
OP明确提出的问题是:“是否可能同时链接34位和64位.so文件?”。这一点毫无疑问,编写shell脚本或make文件与问题或解决方案都没有任何关系。 - us2012
@us2012 我的回答准确地说明了如何使用单个命令链接两者。OP并没有询问他当前方法失败的原因(这肯定是真正的问题)。所以你是对的,我的回答并没有解决实际问题。这个问题甚至没有涉及到真正的问题。 - Code-Apprentice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接