经过数小时的谷歌搜索,我决定放弃并咨询专家。我正在尝试在我的 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣,则为 xgap)。我在 makefile 中添加了CFLAGS=-m32和LDFLAGS=-L/usr/lib32。这些对象被内置到 32 位精细中。最后一步是将 X 窗口的所有对象和库链接到这个可执行文件——xgap。不知何故,它不断给我这个错误:
gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11 -lSM -lICE
/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...
/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...
Run Code Online (Sandbox Code Playgroud)
我已经安装了ia32-libs和mutilib support。我想我只需要强制链接器生成 i386 输出。我尝试在我的 gcc 命令中放置两个ld标志,如上所示:-melf_i386和-oformat elf32-i386。但是发生的情况是 gcc 不再在/usr/lib32 中搜索 32 位库。我想知道是否需要按固定顺序放置这些标志?
感谢您的任何想法和帮助!
编辑:当我在上一个 gcc 命令(我相信是链接阶段)中添加 -m32 标志时,即使我有 -L/usr/lib32 标志,gcc 也不再在 /usr/lib32 中搜索(真的奇怪...)并产生以下错误:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么会发生这种情况?我正在使用自动工具进行配置和制作。我真的很擅长修改那些脚本文件。
EIDT:我解决了这个问题。我认为gcc期待一个静态库档案。我使用http://ubuntuforums.org/showthread.php?t=474790 中的getlibs脚本下载链接所需的所有 .a 档案。然后gcc工作了。我认为gcc确实在/usr/lib32目录中进行了搜索,但没有找到 .a档案,因此继续在/usr/lib的标准目录中搜索,在那里它找到了不兼容的*.so文件。
但问题是:来自ia32-libs包的/usr/lib32/ 中的*.so文件实际上没有链接所需的库?/usr/lib32/中的那些文件是做什么用的?
And*_*ovs 16
LDFLAGS也应该包括在内-m32。以下应该工作:
export LDFLAGS='-m32 -L/usr/lib32'
Run Code Online (Sandbox Code Playgroud)
事实上,您可以删除-L/usr/lib32部分,因为这是 32 位库的默认目录,并且您的系统知道这一点。
基本上,在 64 位机器上构建 32 位应用程序的最简单方法是:
export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make
Run Code Online (Sandbox Code Playgroud)
..或者如果您使用的是自动工具,请提供这些变量来配置脚本。
更新:
似乎您不太熟悉链接静态库和动态库的区别。我会尽量做到最小:
.alibname.a动态libname_s.a版本和静态版本。.so于您的系统中应该存在的运行时库。请注意,我们在此讨论的不是高级技巧,例如使用 dlopen()/dlsym() API 显式加载 DSO。
Vla*_*eev 10
我收到错误,例如:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
Run Code Online (Sandbox Code Playgroud)
这为我修复了它:
sudo apt-get install g++-multilib
Run Code Online (Sandbox Code Playgroud)
如果您使用的是默认包以外的 gcc 包(例如gcc-7),那么您需要安装该特定版本的包:
sudo apt-get install g++-7-multilib
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
79768 次 |
| 最近记录: |