Cross Compiler

refer Cross Compiler

從工作以來就一直使用Cross Compiler 可是現在終於知道為何這樣稱呼 我試著用口語來解釋 當我們使用 compiler 來編譯某個程式 該程式一定只能執行在與你編譯的機器相同的平台 但是現在Cross Compiler編譯出來的不是相同平台 而是要執行在你的target平台上,例如ARM 所以Cross Compiler for ARM就是編譯出來的程式 得由ARM CPU才能執行

那為什麼要這麼做呢 由於Compiler是很大的程式 需要快速運算以及較多的資源 如果由比較慢的原生平台(如ARM)來編譯 那程式設計師不就要常常打瞌睡了 讓快速的x86 PC來擔任編譯ARM程式會較有效率

預設的

  • include path 可以透過 arm-linux-cpp -v 來取得
  • library path 是由 arm-linux-gcc -print-search-dirs 取得

LIBRARY_PATHLD_LIBRARY_PATH 環境變量的區別

LIBRARY_PATHLD_LIBRARY_PATHLinux下的兩個環境變量

  • LIBRARY_PATH 環境變量用於在程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑 例如,指定gcc編譯需要用到的動態鏈接庫的目錄。設置方法如下(其中,LIBDIR1LIBDIR2為兩個庫目錄):

    export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
    
  • LD_LIBRARY_PATH 環境變量用於在程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑

    注意, LD_LIBRARY_PATH 中指定的路徑會在系統默認路徑之前進行查找。設置方法如下(其中, LIBDIR1LIBDIR2 為兩個庫目錄)

    export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
    

    舉個例子,我們開發一個程序,經常會需要使用某個或某些動態鏈接庫,為了保證程序的可移植性,可以先將這些編譯好的動態鏈接庫放在自己指定的目錄下,然後按照上述方式將這些目錄加入到 LD_LIBRARY_PATH 環境變量中,這樣自己的程序就可以動態鏈接後加載庫文件運行了

  • 開發時,設置 LIBRARY_PATH ,以便gcc能夠找到編譯時需要的動態鏈接庫。

  • 發佈時,設置 LD_LIBRARY_PATH,以便程序加載運行時能夠自動找到需要的動態鏈接庫。

also see What is the difference between LD_LIBRARY_PATH and -L at link time?

The settings of LD_LIBRARY_PATH has the highest precedence, so when it is set, the set of directories mentioned by LD_LIBRARY_PATH are searched first even before the standard set of directories. So in your case setting of LD_LIBRARY_PATH is influencing the lookup of the libraries mentioned with -l option. Without LD_LIBRARY_PATH some of the dependencies might have been resolved from the standard set of directories