2010-09-15 2 views
2

Как скомпилировать другой набор библиотек. Когда я компилирую компьютер 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 объект/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 станд :: ios_base :: Init :: Init()» ... Лот больше ошибок ...

Как скомпилировать с другой библиотекой? Почему я должен объяснить, чтобы библиотека libc (не должна ли она быть автоматической)? Я сделал несколько поисков в Интернете, и в некоторых статьях указано, что мне не хватает файла crt0.o, однако я не могу найти этот файл в дереве каталогов i386.

ответ

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

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

+0

Так как я могу скомпилировать, используя старую libstdC++, то есть то, что я пытаюсь сделать. Я не могу найти способ указывать компилятору на использование более старого libstdC++. –

+0

@Dennis Miller Вам нужно использовать более старый компилятор C++, обычно вам нужно что-то вроде g ++ - 4.1 или даже g ++ - 3.4 в зависимости от того, на какую систему вы нацеливаете. – Artyom

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> 

Некоторые примечания:

  • You должны быть осторожны с приоритетом каждого пути include и lib, если у вас есть одна и та же библиотека в разных местах.
  • HAVE использовать кросс-скомпилированную инструментальную цепочку, даже если это от x86 до x86, поскольку процесс кросс-компиляции устранит многие жестко закодированные пути и другие зависимости, которые имеет GCC.
  • Вы должны часто должны предоставить все libs из вашей целевой арки для компиляции против.
  • Посмотрите на Linux From Scratch http://trac.cross-lfs.org/ для обстоятельного обсуждения глубины кросскомпилирует
Смежные вопросы