2

我不是在这里要求解决错误或问题,而只是为了从那些有更多经验的人那里了解一些事情。

我买了一个 BeagleBone Black(安装了 Debian)。我正在使用 gcc-linaro 和 yagarto 工具附带的 make 实用程序在 Windows 上交叉编译 C++。

使用 C 编译器开发 C 代码时,所有工作和执行都很好。

但是,使用 C++ 构建可执行文件并将其传输到骨骼(通过 WinSCP)时,执行时出现以下链接器错误:

“./leds1:/usr/lib/arm-linux-gnueabihf/libstdc++.so.6:找不到版本‘GLIBCXX_3.4.21’(./leds1 需要)”

我并不是要完全解决这个问题。

是不是说在宿主机上构建时,宿主机上定义的库路径和骨骼上定义的库路径不一样?

但是,如果我在我的 makefile 中的链接器命令中添加“-static”以在主机上的编译时静态链接库,则代码会在骨骼上执行,但不确定这是否是我遇到的其他问题的原因.

在这种情况下可以静态链接库吗?我想知道在动态链接的情况下,静态链接的库代码是否与它将链接到骨骼上的代码不同?

当我进行静态链接时,这是否意味着在构建可执行文件时将不再有任何未解决的链接(每个函数都已实现)?例如,我正在调用的 linux system()函数完全内置在我的可执行文件中吗?

很多问题很抱歉,但都与同样的误解有关。提前感谢您的知识。

4

1 回答 1

0

该错误的含义只是在设备上找不到动态 libstdc++.so.6。我不知道这样的图书馆是否真的可用。

很可能静态链接是唯一适用于 libstdc++ 的配置。我知道可以静态链接一些库并动态链接其他库,但我不知道 gcc 或 clang 足以告诉你哪些选项可以做到这一点。

如果你静态链接并且没有未解析的符号,那么是的,你的二进制文件是完整的。

于 2018-01-14T19:31:26.417 回答