Кросс-компиляция с другой библиотекой - PullRequest
2 голосов
/ 16 сентября 2010

Как скомпилировать с другим набором библиотек. Когда я компилирую на компьютере 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 ]

1 голос
/ 16 сентября 2010
/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder)

libstdc ++ на компьютере, который вы пытаетесь запустить, старше, чем тот, на котором вы компилируете, поэтому он жалуется

0 голосов
/ 04 января 2011

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, если у вас одна и та же библиотека в разных местах.
  • Вы ДОЛЖНЫ использовать кросс-скомпилированный набор инструментов, даже если он от x86 до x86, поскольку процесс кросс-компиляции устранит многие жестко-закодированные пути и другие зависимости, которые есть в GCC. *
  • Вы будете часто должны предоставить все библиотек из вашей целевой арки для компиляции.
  • Взгляните на Linux From Scratch http://trac.cross -lfs.org / для подробного обсуждения кросс-компиляции
...