记录一个奇怪的bug:/usr/bin/ld: this linker was not configured to use sysroots

本文记录了解决pyflow在Python3环境下编译遇到的ld链接器配置错误,通过调整编译命令成功编译,并分享了两种可行的编译命令,为后续开发者提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个代码需要编译pyflow,用本地的python2编译得挺好,命令如下:

g++ -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-2.7/pyflow.o build/temp.linux-x86_64-2.7/src/Coarse2FineFlowWrapper.o build/temp.linux-x86_64-2.7/src/Stochastic.o build/temp.linux-x86_64-2.7/src/OpticalFlow.o build/temp.linux-x86_64-2.7/src/GaussianPyramid.o -L/usr/lib64 -lpython2.7 -o /ssd/gy/iSeeBetter/pyflow/pyflow.so

用anaconda装的新环境下的python3编译就出

/usr/bin/ld: this linker was not configured to use sysroots

命令如下:

g++ -pthread -shared -B /ssd/gy/env/vsr/compiler_compat -L/ssd/gy/env/vsr/lib -Wl,-rpath=/ssd/gy/env/vsr/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.7/pyflow.o build/temp.linux-x86_64-3.7/src/Coarse2FineFlowWrapper.o build/temp.linux-x86_64-3.7/src/Stochastic.o build/temp.linux-x86_64-3.7/src/OpticalFlow.o build/temp.linux-x86_64-3.7/src/GaussianPyramid.o -o /ssd/gy/iSeeBetter/pyflow/pyflow.cpython-37m-x86_64-linux-gnu.so

/usr/bin/ld: this linker was not configured to use sysroots
collect2: 错误:ld 返回 1

查了半天有说mv /usr/bin/ld 到 /usr/bin/ld.xxx的,结果直接找不到ld了。

最后搞了一晚上,实在没办法了直接模仿本地Python2的命令居然过了。命令如下:

g++ -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-3.7/pyflow.o build/temp.linux-x86_64-2.7/src/Coarse2FineFlowWrapper.o build/temp.linux-x86_64-3.7/src/Stochastic.o build/temp.linux-x86_64-3.7/src/OpticalFlow.o build/temp.linux-x86_64-2.7/src/GaussianPyramid.o -L/usr/lib64 -o /ssd/gy/iSeeBetter/pyflow/pyflow.so

实验发现把中间那些乱七八糟的删掉也可以过:

g++ -pthread -shared build/temp.linux-x86_64-3.7/pyflow.o build/temp.linux-x86_64-3.7/src/Coarse2FineFlowWrapper.o build/temp.linux-x86_64-3.7/src/Stochastic.o build/temp.linux-x86_64-3.7/src/OpticalFlow.o build/temp.linux-x86_64-3.7/src/GaussianPyramid.o -o /ssd/gy/iSeeBetter/pyflow/pyflow.cpython-37m-x86_64-linux-gnu.so

这是说-sysroot=/报错的话,删掉就ok?

g++真是神奇,编译的姿势水平还有待提高......

<think>我们被要求解释Linux中`echo $PATH`命令的输出。用户在执行`echo$PATH`(注意没有空格)时遇到了错误,但实际正确的命令是`echo$PATH`(有空格)。用户意图是查看环境变量PATH的值。根据引用[1],PATH环境变量包含一系列目录,Linux在这些目录中查找命令或程序。引用[2]提到了在.bashrc文件中设置环境变量的方法,而引用[3]则解释了LD_LIBRARY_PATH通常为空的原因,但这里我们关注的是PATH。正确的命令应该是:```bashecho$PATH```在典型的Linux系统中,PATH环境变量包含多个由冒号分隔的目录路径。例如:``` /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin``` 这个输出表示当用户输入一个命令时,系统会按照这个顺序在这些目录中查找可执行文件。 用户之前错误的命令`echo$PATH`(没有空格)导致bash将其解释为一个名为`echo$PATH`的命令,因此报错&ldquo;No suchfile ordirectory”。现在,我们按照要求用中文回答,并生成相关问题。同时,注意在回答中引用参考。由于用户上一次的问题是关于`echo$PATH`报错,而我们已经解释了正确的用法,接下来将给出PATH的典型值以及如何查看。注意:不同的Linux发行版或用户自定义配置可能导致PATH的值有所不同。</think>### Linux `echo $PATH` 命令解析 `echo $PATH` 命令用于显示当前系统的环境变量 `PATH` 的值,该变量定义了系统在哪些目录中搜索可执行程序。在标准 Linux 系统中,该命令通常返回如下格式的输出: ```bash /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin ``` #### 输出详解: 1. **目录结构** 每个路径由冒号 `:` 分隔,表示系统搜索命令的顺序: - `/usr/local/sbin`:系统管理员安装的本地管理程序 - `/usr/local/bin`:用户安装的本地程序 - `/usr/sbin`:系统管理程序(需 root 权限) - `/usr/bin`:大多数用户命令 - `/sbin`:系统修复关键命令 - `/bin`:系统核心命令 - `/usr/games`:游戏程序 - `/usr/local/games`:本地安装的游戏 - `/snap/bin`:Snap 包管理器的程序 2. **搜索顺序** 系统从左到右搜索目录,例如: - 输入 `ls` 时,优先在 `/usr/local/sbin` 查找 - 若未找到,则依次向后搜索 `/usr/local/bin` → `/usr/sbin` → ... → `/snap/bin` 3. **数学表示** 搜索过程可表示为: $$ \text{命令查找顺序} = \bigcup_{i=1}^{n} \text{dir}_i \quad \text{其中} \quad \text{dir}_i \in \text{PATH} $$ 系统在找到第一个匹配的可执行文件后停止搜索[^1]。 #### 常见问题解决: - **输出为空**:检查 `~/.bashrc` 或 `/etc/profile` 中的 `PATH` 定义(参考引用[2]) - **路径不存在错误**:使用 `find / -type d -name "bin" 2>/dev/null` 验证目录存在性 - **自定义路径添加**: ```bash export PATH=$PATH:/your/custom/path # 临时添加 echo 'export PATH=$PATH:/your/custom/path' >> ~/.bashrc # 永久生效 ``` > **注意**:`PATH` 与 `LD_LIBRARY_PATH`(库文件搜索路径)不同,后者默认通常为空(参考引用[3])。 --- ### 相关问题 1. 如何永久添加自定义目录到 Linux 的 PATH 环境变量? 2. `command not found` 错误与 PATH 配置有何关联? 3. 不同用户(root/普通用户)的 PATH 变量为何不同? 4. Linux 系统启动时如何加载 PATH 环境变量? 5. PATH 变量中的目录顺序对系统性能有何影响? [^1]: Linux 环境变量管理规范 [^2]: 系统配置文件加载机制 [^3]: 动态链接库路径解析原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值