ld和lld仅使用我输入的路径

问题描述

我正在尝试为树莓派进行交叉编译,不幸的是,该pi的libstdc ++版本比我的构建机器还旧,当我尝试运行可执行文件时,它说“ ./ :/ usr / lib / arm -linux-gnueabihf / libstdc ++。so.6:未找到版本“ GLIBCXX_3.4.26”(./ 所需)。我已经使用“ -static”使其工作了,但实际上我很想成​​为能够告诉ld(gcc链接器)和lld(clang链接器)“仅在 any 库的这些路径中查找”,它一直在寻找系统并针对该系统进行链接。 raspBerry pi的/ usr / lib和/ lib目录转到主机,我只想说“仅使用/ path_to_raspBerry_pi_rsync / lib和/ path_to_raspBerry_pi_rsync / usr / lib”。

获得ld和lld告诉我尝试链接时使用的路径的奖励点。

解决方法

我希望能够告诉ld(gcc链接器)和lld(clang链接器)“仅在这些路径中查找任何库”

如果您提供足够的内容-L/path/to/target/libraries,那么两者都会做到。

它一直在寻找系统之一并与之链接。我已经将树莓派的/ usr / lib和/ lib导演同步到主机上,我只想说“仅使用/ path_to_raspberry_pi_rsync / lib和/ path_to_raspberry_pi_rsync / usr / lib”。

您的问题很可能源于您rsync所拥有的是运行时库,而不是实际的开发库。所以如果/path_to_raspberry_pi_rsync/usr/lib包含libstdc++.so.6,但包含libstdc++.so符号链接,则链接器将继续寻找libstdc++.so.,直到在链接器中找到一个。系统目录。

添加中,一旦成功将链接限制为仅“ rsync”库,链接可能会因未解析的libstdc++符号而失败。那是因为您需要一组 matching 标头和库。

您最好的选择是获取针对您的运行时环境的 proper 工具链。

获得ld和lld告诉我尝试链接时使用的路径的奖励点。

使用ld,您可以添加-Wl,-t标志,它将告诉您打开的每个库和目标文件。 lld也可以支持此标志。