2010-03-29 105 views
0

通常情況下,當必須動態鏈接的庫的路徑在LD_LIBRARY_PATH中定義時,或者在創建二進制文件時將使用-L標記來提及。動態鏈接:鏈接路徑的更改

在實際情況下,如果可以說二進制文件已經在客戶端構建和部署。 現在,如果其中一個動態鏈接庫路徑的路徑發生更改。 然後我們需要爲部署二進制文件的所有客戶端提供一個新的make文件。

是否有其他方法,我們不需要告訴所有的客戶端來改變他們的makefile,並且可以在代碼本身做些事情? 如果是的話......任何人都可以請建議如何?

這是一個諷刺的問題,我問了一個面試問題,但我沒有答案。

編輯:我被特別詢問可以在沒有觸摸makefile的情況下在代碼中做什麼。

+0

LD_LIBRARY_PATH與鏈接無關。它僅適用於運行時。 – 2010-03-29 11:41:41

回答

0

使用環境變量,如MYLIBPATH,並在makefile中使用此變量,而不是硬編碼值。

所以每次客戶端可以有自己的目錄結構,只要他們正確地指定MYLIBPATH,你的程序建立確定。

或者你可以看看圖書館在你的makefile,這樣

LIBPATH = $(shell find/-name libmylib.a -exec dirname {} ";" -quit) 

myprog: myprog.c 
     $(CC) myprog.c -lmylib -L$(LIBPATH) 

編輯:locatefind取代與-quit選項

+0

是的..這實際上是我的答案......但這並不是面板所同意的。他們希望能夠在代碼中完成 – Vijay 2010-03-29 11:37:24

+0

是'locate'命令僅存在於Linux上? – Vijay 2010-03-29 12:12:14

+0

查看更新後的答案 - 它使用POSIX'find',因此它在所有Unix上都可以正常使用 – qrdl 2010-03-29 12:38:42

1

通常你應該只改變LD_LIBRARY_PATH只返回第一個匹配,除非這可能與使用硬編碼搜索路徑的編譯有關:rpath