C++ 与另一个库交叉编译

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机器库进行交叉

如何使用另一组库进行编译。当我在i686 Fedora 13计算机上编译时,它运行良好。但是,当我获取可执行文件(通过thumbdrive)并尝试在另一台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,深入讨论交叉编译

那么,如何使用旧版本的libstdc++进行编译,这正是我试图实现的目标。我找不到一种方法来指出编译器使用旧的LIbSTDc++。@丹尼斯米勒,你需要使用旧的C++编译器,通常你需要像G++ 4.1甚至G+ 3.4这样的东西,这取决于你瞄准的是什么系统。
/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>