簡體   English   中英

與另一個庫交叉編譯

[英]Cross compile with another library

如何使用另一套庫進行編譯。 當我在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 /c++/4.4.4 __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()的__static_initialization_and_destruction_0': /usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/iostream:72: undefined reference to ...更多錯誤...

我們如何與另一個庫一起編譯? 為什么我必須明確指向libc庫(這不是自動的)? 我已經在Internet上進行了一些搜索,並且一些文章指出我缺少crt0.o文件,但是在i386目錄樹中找不到此文件。

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

您嘗試運行的計算機上的libstdc ++比您在其上編譯的libstdc ++老,這就是為什么它抱怨

實際上,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路徑的優先級。
  • 必須使用一個交叉編譯工具鏈,即使是從86到86,因為交叉編譯過程中會消除許多硬編碼路徑和GCC有其他依賴。
  • 通常必須提供目標拱的所有庫以進行編譯。
  • 看看Linux From Scratch http://trac.cross-lfs.org/可以深入了解交叉編譯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM