2012-03-24 89 views
2

我正在Linux下開發一個C++程序。我希望把一些東西(具體而言,LLVM位碼文件,但是這並不重要)在圖書館,所以我想下面的目錄結構:如何找到「我的」lib目錄?

/somewhere/bin/myBin 
/somewhere/lib/myLib.bc 

如何找到lib目錄?我試圖計算從argv[0]的相對部分,但如果/somewhere在我的PATH中,argv[0]將只包含myBin。有什麼方法可以獲得這條路嗎?或者我必須在編譯時設置它?

GNU autotools如何處理這個問題?如果我將--prefix選項提供給./configure,會發生什麼情況?

編輯:是有點在我的情況產生誤導。我的由LLVM位碼組成,所以它不是一個實際的(共享)對象文件,只是我想從我的程序打開的一個文件。您可以將其視爲圖像或文本文件。

+1

如果您的庫是靜態的,只需添加-L your/lib/dir;如果它是動態的,你可以有一個LD_LIBRARY_PATH等...... – 2012-03-24 11:59:22

+0

正如我所說,該庫是一個LLVM位碼文件,所以這些都沒有幫助。把它想象成我想從我的程序中讀取的圖像或文本文件。 – 2012-03-24 12:29:30

回答

1

也許你想要的是:

/usr/lib 

UNIX目錄參考:http://www.comptechdoc.org/os/linux/usersguide/linux_ugfilestruct.html

+0

是的,知道。理想情況下,我希望能夠隨意移動程序,只要二進制文件位於/ usr/bin中,/ usr/lib就可以。我的課程將被整合到我的大學的椅子的開發環境中,並且他們使用不同的路徑。釋放和調試二進制文件。 – 2012-03-24 12:13:05

0

假設你的lib目錄是 「../lib」 相對於可執行

首先,你需要查明myBin位於,您可以通過閱讀/ proc/self/exe得到它

然後concat您的二進制文件路徑與「../lib」將給你的lib直接RY。

+0

這應該起作用,但是我總是試圖避免依賴於平臺的代碼。 – 2012-03-24 12:34:17

0

您將不得不使用編譯器標誌來告訴程序。舉例來說,如果你有一個插件目錄:

# Makefile.am 
AM_CPPFLAGS = -DPLUGIN_DIR=\"${pkglibdir}\" 
bin_PROGRAMS = awesome_prog 
pkglib_LTLIBRARIES = someplugin.la 
+0

這似乎是合理的。現在我只需要找出如何將您的示例轉換爲scons。 – 2012-03-24 12:32:44

0

要搜索存儲在文件中/etc/ld.so.conf目錄列表。

在Linux中,環境變量LD_LIBRARY_PATH是一組以冒號分隔的目錄,其中應首先在標準目錄集之前搜索庫;這在調試新庫或使用非標準庫用於特殊用途時非常有用。

LD_LIBRARY_PATH是非常方便的開發和測試:

$ export LD_LIBRARY_PATH=/path/to/mylib.so 
$ ./myprogram 

[read more]

+0

庫是LLVM位碼,所以我不能使用它。 – 2012-03-24 12:31:14

0

解決這個問題的唯一部分 「?如何與這個GNU自動交易」 ...

當你分配一個--prefix進行配置,基本上有兩件事情發生:1)它指示構建系統將所有內容安裝在$ {prefix}中,2)它在$ {prefix} /share/config.site中查找任何有關如何的其他信息系統已建立(該文件不存在是很常見的)。它完全沒有任何功能可以幫助查找庫,但取決於用戶是否已正確設置工具鏈。如果你想在/ foo/lib中使用一個庫,你必須設置好你的工具鏈來查看它(例如,把/ foo/lib放在/etc/ld.so中。conf或LD_LAGARY中的-L/foo/lib和LD_LIBRARY_PATH中的「/ foo/lib」)。

configure腳本依賴於您設置環境。它不能幫助你建立這樣的環境,但通過提醒你還沒有這樣做會有所幫助。

0

您可以使用readlink系統調用/proc/self/exe來獲取可執行文件的路徑。您可能會使用realpath等。

相關問題