2010-09-15 64 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 OBJ /調試/ 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()」 ......很多錯誤...

我們如何編譯另一個庫?爲什麼我必須明確指向libc庫(不應該是自動的)? 我在網上做了一些搜索,一些文章指出我錯過了crt0.o文件,但是我在i386目錄樹上找不到這個文件。

回答

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

您要運行較舊,則一個編譯機器上的libstdC++,這就是爲什麼它是抱怨

+0

進行了深入的討論,所以,我怎麼可以編譯使用舊的libstdC++,那就是我試圖完成。我找不到一種方法指出編譯器使用較舊的libstdC++。 – 2010-09-16 14:10:45

+0

@Dennis Miller您需要使用較老的C++編譯器,通常您需要類似g ++ - 4.1甚至g ++ - 3.4的版本,具體取決於您定位的系統是什麼。 – Artyom 2010-09-16 14:13:54

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路徑的優先級。
  • 使用交叉編譯的工具鏈,即使它是從x86到x86,因爲交叉編譯過程將消除許多硬編碼路徑和GCC所具有的其他依賴項。
  • 你會經常必須提供所有從您的目標拱編譯的庫。
  • 看看Linux的劃痕http://trac.cross-lfs.org/爲交叉編譯