2010-11-22 96 views
109

我正在構建一個簡單的C++程序,我想暫時用一個系統提供的共享庫和它的更新版本替代開發和測試。LD_LIBRARY_PATH vs LIBRARY_PATH

我嘗試設置LD_LIBRARY_PATH變量,但鏈接器(LD)與失敗:

在/ usr /斌/勞工處:找不到-lyaml-CPP

我預計,因爲工作根據ld的手冊頁:

鏈接器使用以下搜索 路徑定位所需的共享庫 :...對於天然I着墨, 的環境變量 「LD_LIBRARY_PATH」的內容...

然後我嘗試設置LIBRARY_PATH,而且工作。

根據GCC手冊:

LIBRARY_PATH的值是一個冒號分隔的列表 ,很像PATH。當 配置爲本地編譯器時,GCC 在搜索特殊鏈接程序 文件(如果它無法使用 GCC_EXEC_PREFIX找到它們)時嘗試搜索如此指定的目錄 。使用GCC 進行鏈接時, 也會使用這些目錄搜索 的普通庫中的-l選項(但指定以-L指定的目錄 )。

正如(GCC)手冊所示,LIBRARY_PATH的工作原理是因爲我與GCC鏈接。

但是...

  • 因爲我用gcc爲什麼LD爲 被稱爲鏈接,作爲錯誤信息 建議?
  • 有兩個變量服務相同的 的目的是什麼?有沒有其他 區別?

回答

156

LIBRARY_PATH所使用的GCC編譯之前,搜索包含靜態庫需要被鏈接到你的程序目錄。

LD_LIBRARY_PATH被程序用來搜索包含共享庫的目錄後,它已被成功編譯和鏈接。

編輯: 如下所示,您的庫可以是靜態的或共享的。如果它是靜態的,那麼代碼將被複制到您的程序中,並且您的程序編譯和鏈接後無需搜索庫。如果你的圖書館是共享的,那麼它需要動態鏈接到你的程序,這就是LD_LIBRARY_PATH發揮作用。

+11

當然LD_LIBRARY_PATH的只對具備動態庫 – 2010-11-22 22:11:58

+2

感覺我的觀點是,如果我是用LD用於連接(直接), 然後,根據LD手冊,LD_LIBRARY_PATH會 被用於搜索包含目錄需要鏈接到我的程序的庫 。我必須在這裏丟失一些東西。 – 2010-11-22 22:20:29

29

LD_LIBRARY_PATH程序啓動時搜索,LIBRARY_PATH在鏈接時搜索。

8

因爲我與gcc鏈接,爲什麼ld被調用,如錯誤消息所示?

gcc在鏈接模式下在內部調用ld。