【发布时间】:2013-10-30 04:27:24
【问题描述】:
尽量保持简短的背景:我正在开发一个非常大的 C++ 应用程序,它主要使用 32 位 Ubuntu 服务器 12.04 上的库进行编译,但有一些例外:libsdl1.2-dev、libedit-dev、和 uuid-dev(与 apt-get 一起安装)。除非出现错误,否则我们的构建系统会包装/隐藏大部分输出。
我正在尝试使用工具链为不同的操作系统交叉编译应用程序。主机构建机器是 Ubuntu 12.04,目标操作系统是内部 linux 操作系统。工具链包含大多数标准的 linux 库,因此,对于缺少的库(如 libedit 和 libSDL),我只是在作弊(现在),只是在工具链中创建软链接以指向 Ubuntu 机器上的那些。
交叉编译的应用程序在链接器阶段 (ld) 失败并出现以下错误:
<toolchain>/bin/ld: warning: libbsd.so.0, needed by <toolchain>/lib/libedit.so, not found (try using -rpath or -rpath-link)
...所以我在非交叉编译的二进制文件上运行 'ldd' 以找到 libbsd,然后就这样做了
ln -s /lib/libbsd.so.0 <toolchain>/lib/libbsd.so.0
我已经为几个不同的库做了这个来克服错误。
问题:现在我的作弊适得其反,我看到了:
blah.cpp:46: more undefined references to `__stack_chk_guard' follow
collect2: error: ld returned 1 exit status
我不知道从哪里开始寻找,也不知道哪些工具对调试有用。非常感谢任何帮助!
【问题讨论】:
-
您不能链接到针对不同架构或系统编译的库。您唯一的选择是为您的目标交叉编译缺少的库。不作弊!
-
看起来您的应用程序有一些额外的编译器标志,这些标志在构建其他库或工具链的标准库时没有使用。
__stack_chk_guard属于 GCC's stack smashing protector。
标签: linker compiler-errors linker-errors cross-compiling