【发布时间】:2015-12-23 05:35:41
【问题描述】:
我有 Ubuntu 12.01 和 gcc 4.8.2,并希望为运行旧 2.6.23 内核的 Vortex86DX CPU 进行交叉编译。
我正在尝试以下测试代码:
#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
}
使用以下命令行编译:
g++ -static-libgcc -static-libstdc++ -march=i586 test.cpp -otest586
当我在目标架构上运行 test586 时,我收到了这个错误:
$ ./test586
./teste586: symbol lookup error: ./test586: undefined symbol: _ZMSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE
对这里发生的事情有任何想法吗?这只是一个小代码——真正的代码有大约 10 个不同的库,全部用 C++ 11 编写。
事实上,Marco 的评论是对的。代码还需要一些动态库:
$ ldd ./test586
linux-gate.so.1 => (0xb776b000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a4000)
/lib/ld-linux.so.2 (0xb776e000)
我必须避免 all 动态库,因为目标系统要么没有它们,要么将具有非常旧的版本。
帮助实现这一目标。
【问题讨论】:
-
看起来你缺少一些动态库,你试过 ldd ./test586 吗?
-
我不想使用动态库,这就是为什么我选择
-static标志(目标硬件没有这个库)....我怎样才能避免使用这些库? -
是的,您使用 -static 是正确的,但看起来您的可执行文件仍在动态查找某些内容,ldd 会告诉您您的程序正在尝试加载哪些库以及失败的位置
-
你是对的...非常好的观点...现在我需要帮助来避免它们...请查看已编辑的帖子。
-
马可说得对。我们了解您不想要动态链接,但目前您是。
ldd将告诉您应该归咎于哪个库,为您提供如何继续调试的指导。
标签: c++ g++ cross-compiling