0

我正在尝试为我的树莓派交叉编译,不幸的是,pi 的 libstdc++ 版本比我的构建机器旧,当我尝试运行我的可执行文件时,它显示“./<exe_name>: /usr/lib/arm-linux- gnueabihf/libstdc++.so.6:找不到版本“GLIBCXX_3.4.26”(./<exe_name> 需要)。我已经通过使用“-static”让它工作了,但我真的很想知道ld(gcc 链接器)和 lld(clang 链接器)“只在这些路径中查找任何库”它一直在寻找系统之一并链接它。我已经同步了树莓派的 /usr/lib 和 /lib 目录转到主机,我只想说“使用 /path_to_raspberry_pi_rsync/lib 和 /path_to_raspberry_pi_rsync/usr/lib”。

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

4

1 回答 1

1

我希望能够告诉 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”d 库,您的链接很可能会因未解析的符号libstdc++而失败。那是因为您需要一组匹配的头文件和库。

您最好的选择是获得针对您的运行时环境的适当工具链。

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

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

于 2020-11-02T04:00:34.507 回答