这个想法可能看起来很奇怪。我正在为 linux 创建一个开发环境。创建目录/home/user/myOS。它有 usr、usr/bin、usr/lib 和链接 bin->usr/bin、lib->usr/lib。我从一个操作系统中复制了必要的二进制文件和库(我们称之为 OSold,它更旧)。但是,我想在这个环境下使用新的编译器进行编译,所以我从另一个系统(我们称它为 OSnew,它是新鲜的)复制 g++ 和 gcc。(我不确定如果没有实际的 libc,我能否做点什么)。顺便说一句,环境是在 OSnew 上创建的。
我通过 chroot 进入环境。当编译器启动时,会发生以下情况:
bash-3.00# g++
g++: /lib/libc.so.6: version `GLIBC_2.11' not found (required by g++)
g++: /lib/libc.so.6: version `GLIBC_2.4' not found (required by g++)
我知道他需要这些库才能运行。我创建了一个单独的目录:/home/user/myOS/home/mylibs。我将实际的 libc 库放入其中。再次chroot,然后执行以下操作:
bash-3.00# LD_LIBRARY_PATH=/home/mylibs g++
但它仍然首先扫描标准目录并因上述错误而崩溃。尝试并通过出口 - 都一样。
告诉我如何在运行可执行文件时强制 shell 准确使用我的库?通常,LD_LIBRARY_PATH 正常工作需要什么?(然后我可以很好地复制一些重要的东西)。
关于重复的问题
这个问题是关于系统位数之间的差异。还有一个关于库版本的问题。
更新程序
很可能,在这个问题的框架内,如此强烈的变化是不可接受的。但是让版主决定。
一般来说,chroots可以忘记。在真正的旧系统上,在新系统上编译的程序使用以下命令运行:
g++ -m32 main.cpp -o Main -Wl,--hash-style=sysv
但是,当使用新的标准构造时,C++ 会生成以下内容:
./Main: /usr/lib/libstdc++.so.6: version 'GLIBC_3.4.21' not found (required by ./Main)
我试图指定新库的路径(显然是 32 位):
LD_LIBRARY_PATH="/home/temp/mylibs/" ./Main
./Main: error while loading shared libraries: /home/temp/mylibs/libstdc++.so.6: ELF file OS ABI invalid
任何想法如何解决这个问题?
@AccumPlus,编写了一个小的 shell 脚本,希望对库路径有所帮助。该脚本在启动目录中创建了三个程序,并分别为它们创建了三个动态链接库。将程序和库分散在 chroot 目录中,可以评估环境设置的正确性。
运行脚本
mkdir -p $HOME/HelloPrograms && cd $HOME/HelloProgramsbuild-hello.shsh build-hello.shbuild-hello.sh
希望它对您的搜索有所帮助:)
附言。忘了...查看所需的库,运行,例如:
ldd $HOME/HelloPrograms/HelloProgram-1添加:构建交叉编译工具包
既然最后明确了目标,竟然是构建交叉编译的工具,那我就继续答题。
一般来说,我认为初始信息就足够了。这个问题不是很简单 - 一个关于 ruSO 的主题显然是不够的。