C++ 与另一个库交叉编译
如何使用另一组库进行编译。当我在i686 Fedora 13计算机上编译时,它运行良好。但是,当我获取可执行文件(通过thumbdrive)并尝试在另一台i386机器上运行它时,会收到以下错误消息C++ 与另一个库交叉编译,c++,libraries,compilation,cross-compiling,C++,Libraries,Compilation,Cross Compiling,如何使用另一组库进行编译。当我在i686 Fedora 13计算机上编译时,它运行良好。但是,当我获取可执行文件(通过thumbdrive)并尝试在另一台i386机器上运行它时,会收到以下错误消息 /usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder) 好的,所以我必须使用i386库进行编译,这样它才能兼容。但是,i368机器没有编译器。因此,我必须找到一种使用i386机器库进行交叉
/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder)
好的,所以我必须使用i386库进行编译,这样它才能兼容。但是,i368机器没有编译器。因此,我必须找到一种使用i386机器库进行交叉编译的方法。因此,我将所有i386目录树复制到i686机器中,并尝试使用-nostlib和指向所有库来使用i386,我整天都在玩设置,没有找到任何地方
我继续尝试做一个小程序作为测试,看看是否可以让它先交叉编译。还是不走运
/// \file main.cpp
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main()
{
std::cout << "Testing!" << std::endl;
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
printf("POSIX Thread Priority Scheduling supported\n");
#else
#warning "POSIX Thread Priority Scheduling NOT supported."
#endif
#ifdef _POSIX_THREAD_PRIO_PROTECT
printf("POSIX Thread Priority Ceiling supported");
#else
#warning "POSIX Thread Priority Ceiling NOT supported"
#endif
#ifdef _POSIX_THREAD_PRIO_INHERIT
printf("POSIX Thread Priority Ceiling supported");
#else
#warning "POSIX Thread Priority Ceiling NOT supported"
#endif
return 0;
}
我在链接时出错
g++ -L../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib -o bin/Debug/Test2 obj/Debug/main.o -nostdlib ../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib/libpthread-2.5.so ../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib/libc-2.5.so
000000000 80482A0
obj/Debug/main.o:在函数中\u静态\u初始化\u和\u销毁\u 0':
/usr/lib/gcc/i686 redhat linux/4.4.4/../../../../../../../include/c++/4.4.4/iostream:72:
未定义的引用
std::ios\u base::Init::Init()
…更多的错误
我们如何使用另一个库进行编译?为什么我必须明确地指向libc库(这不是自动的吗)?
我在互联网上做了一些搜索,有些文章说我缺少一个crt0.o文件,但是我在i386目录树上找不到这个文件
您试图运行的机器上的libstdc++比您编译的机器上的旧,这就是为什么它抱怨GCC实际上在其源代码中硬编码了一些路径。最好的办法是找出目标系统上安装了哪个版本的glibc,然后下载该系统的编译器 你能更详细地描述一下你的系统吗?它运行Linux吗?哪个内核和glibc/ulibc版本 在类似情况下,我要做的是在编译时指定include和link路径,因此最终得到如下结果:
<path to g++>/g++ -I<includes for my version system libs> -Wl,--rpath-link <custom libs path> -L <same custom libs path>
/g++-I-Wl,--rpath-link-L
一些注意事项:
- 如果在不同的位置有相同的库,则必须注意每个include和lib路径的优先级
- 您必须使用交叉编译的工具链,即使是从x86到x86的工具链,因为交叉编译过程将消除GCC具有的许多硬编码路径和其他依赖项
- 您通常必须提供目标arch中的所有LIB来进行编译
- 从零开始看Linux,深入讨论交叉编译
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to
/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder)
<path to g++>/g++ -I<includes for my version system libs> -Wl,--rpath-link <custom libs path> -L <same custom libs path>