将 32 位和 64 位 .so 文件与 g++ 链接以用于 c++ 程序
Posted
技术标签:
【中文标题】将 32 位和 64 位 .so 文件与 g++ 链接以用于 c++ 程序【英文标题】:Linking both 32bit and 64bit .so files with g++ for a c++ program 【发布时间】:2012-12-25 14:42:59 【问题描述】:我正在尝试为 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/森林/SoarSuite/out/include -leng -lmat -lmex -lut -lSoar我得到以下输出,因为它无法识别 32 位 .so 文件:
/usr/bin/ld:搜索-leng时跳过不兼容的/usr/local/MATLAB/R2012a_Student/bin/glnx86//libeng.so /usr/bin/ld: 找不到 -len /usr/bin/ld:搜索-lmat时跳过不兼容的/usr/local/MATLAB/R2012a_Student/bin/glnx86//libmat.so /usr/bin/ld: 找不到 -lmat /usr/bin/ld:搜索-lmex时跳过不兼容的/usr/local/MATLAB/R2012a_Student/bin/glnx86//libmex.so /usr/bin/ld: 找不到 -lmex /usr/bin/ld:搜索-lut时跳过不兼容的/usr/local/MATLAB/R2012a_Student/bin/glnx86//libut.so /usr/bin/ld: 找不到 -lut collect2: ld 返回 1 个退出状态当我使用 -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 /家/森林/SoarSuite/out/include -leng -lmat -lmex -lut -lSoar我得到以下输出,因为现在它无法识别 64 位 .so 文件:
/usr/bin/ld: 搜索 -lSoar 时跳过不兼容的 /home/forest/SoarSuite/out//libSoar.so /usr/bin/ld: 找不到 -lSoar /usr/bin/ld:在搜索 -lstdc++ 时跳过不兼容的 /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so /usr/bin/ld:在搜索 -lstdc++ 时跳过不兼容的 /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a /usr/bin/ld: 找不到 -lstdc++ collect2: ld 返回 1 个退出状态是否可以同时链接 34 位和 64 位 .so 文件? 谢谢。
【问题讨论】:
你为什么要这样做? @user93353 我正在使用 C++ 程序在 Matlab 和称为 SOAR 的认知架构之间进行接口。我真的没有选择在我的计算机上执行此操作,因为我只有 Matlab 的 32 位二进制文件和 SOAR 的 64 位二进制文件,而且我没有重新编译它们的源文件。 【参考方案1】:不,这是不可能的。 32位库只能链接成32位可执行文件,64位库只能链接成64位可执行文件。
如果您尝试链接的 Matlab 库仅作为 32 位可用,则您还需要将应用程序构建为 32 位(使用 -m32
),并且仅链接 32 位库。
【讨论】:
好吧,我害怕那个。感谢您的快速回复。【参考方案2】:我建议制作一个运行两个编译器命令的 shell 脚本或文件。
【讨论】:
问题在问题中描述为“尝试链接为 32 位失败并尝试链接为 64 位失败”,您建议的解决方案是“两者都做”。这有什么帮助? @us2012 我回答了 OP 的明确问题,询问如何链接某些代码的 32 位和 64 位版本。当然,在更仔细地查看输出之后,我可以看到真正的问题应该是为什么在这两种情况下链接都会失败。 OP 明确要求的是,我引用,“是否可以同时链接 34 位和 64 位 .so 文件?”。没有什么不清楚的,制作shell脚本或制作文件与问题或解决方案无关。 @us2012 我的回答准确地说明了如何将两者与单个命令链接。 OP 没有询问为什么他当前的方法失败(这当然是真正的问题)。所以你是对的,我的回答没有解决真正的问题。这个问题甚至没有解决真正的问题。以上是关于将 32 位和 64 位 .so 文件与 g++ 链接以用于 c++ 程序的主要内容,如果未能解决你的问题,请参考以下文章
ReactNative关于32位和64位SO库混合引入Crash解决方案
用于创建 32 位和 64 位安装程序的一个 .wxs 文件中的注册表项出现问题