与另一个库交叉编译

时间:2010-09-15 21:08:03

标签: 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机器库进行交叉编译的方法。所以我将所有i386目录树复制到i686机器上并尝试使用-nostdlib并指向所有库以使用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++ -O3 -pedantic -Wextra -Wall -g -c /home/dmiller3/Experiments/Test2/main.cpp -o obj/Debug/main.o

链接时我收到错误。

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 
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to
     

00000000080482a0       obj / Debug / main.o:在函数__static_initialization_and_destruction_0': /usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/iostream:72: undefined reference to 中std :: ios_base :: Init :: Init()'       ......还有更多错误...

我们如何使用其他库编译?为什么我必须明确指向libc库(这不应该是自动的)? 我在互联网上做了一些搜索,有些文章说我错过了一个crt0.o文件,但我在i386目录树上找不到这个文件。

2 个答案:

答案 0 :(得分:1)

/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder)

您尝试运行的计算机上的libstdc ++比您编译的计算机上的libstdc ++更旧,这就是为什么它在抱怨

答案 1 :(得分:0)

GCC实际上硬编码了源代码中的一些路径。您最好的办法是找出目标系统上安装的glibc版本,然后下载该系统的编译器。

您能更详细地描述一下您的系统吗?它运行Linux吗?哪个内核和glibc / ulibc版本?

在类似的情况下我必须做的是在编译时指定包含和链接路径,所以你最终得到这样的东西:

<path to g++>/g++ -I<includes for my version system libs> -Wl,--rpath-link <custom libs path> -L <same custom libs path>

一些注意事项:

  • 如果在不同的位置有相同的库,则必须注意每个include和lib路径的优先级。
  • HAVE 使用交叉编译的工具链,即使它是从x86到x86,因为交叉编译过程将消除许多硬编码路径和GCC所具有的其他依赖关系。 / LI>
  • 经常必须从目标arch提供所有 lib来编译。
  • 查看Linux From Scratch http://trac.cross-lfs.org/,深入讨论交叉编译