[英]Linux C++ LD_LIBRARY_PATH suppressing standard libraries
我是C ++的新手,雖然我最近做了一些Objective C,所以有些看起來很模糊。
我正在編寫一些測試程序來判斷某些事情是否可行。 在我(非常簡單的'Hello World')程序中,我使用cout輸出一些文本,但是當我修改LD_LIBRARY_PATH
指向第三方應用程序所需的某些庫時,我將與之通信輸出但沒有來自g ++的編譯器錯誤。
我已經嘗試過包含標准路徑,例如/usr/local/lib:/usr/lib:/lib
但是當我在路徑中包含它時仍然沒有輸出。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World";
return 0;
}
正如你所看到的那樣,在我設置LD_LIBRARY_PATH
之前,它是一個非常簡單的程序。
我在任何階段都沒有得到任何錯誤,所以我無法知道它是否正在運行。 有什么我可以檢查或以任何方式測試程序是否運行?
PS我也嘗試將輸出寫入一個在設置路徑之前工作的文件。
非常感謝
感謝您的回復(請參閱下面的評論結果)
基於@Nemo所說的第三方應用程序有自己的libstdc ++版本。所以,這是正確的,我已經用標准安裝版本換出了他們的庫版本。 雖然我現在正在獲取“Hello World”輸出,但我仍然收到大量No such file or directory
錯誤,因此我猜測問題只是部分修復。 我不確定我所做的是“允許”還是如何從這里開始。
如果您運行:
ldd a.out
其中a.out是可執行文件的名稱,它將打印該可執行文件的運行時共享庫依賴項(請參閱http://linux.die.net/man/1/ldd )
這是一個示例輸出:
linux-vdso.so.1 => (0x00007fff463ff000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f75f6979000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75f65ba000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f75f62bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f75f6c85000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f75f60a7000)
現在,一旦你知道你的應用程序正在搜索什么,你必須知道它正在LD緩存(或動態鏈接器緩存)中搜索它。 這通常存儲在/etc/ld.so.cache中。 但是,您不應手動編輯它。 相反,您應該使用ldconfig重新生成該緩存。
您可以使用:
ldconfig -p
顯示所有緩存條目。
當你跑步
ldconfig
(作為root),你將重新生成ldcache。 除非使用“-n”,否則將默認掃描'/ lib'和'/ usr / lib'目錄以及文件'/etc/ld.so.conf'中列出的任何目錄。 可以在命令行上指定其他目錄。
當調用可執行文件時,它還將檢查ldd輸出中列出的任何文件的LD_LIBRARY_PATH(除了ldcache之外)中的路徑。
所以,你可以做的是運行:
ls -lah
在您的exectuable的ldd輸出中列出的每個文件上。 如果缺少任何文件,則必須使用/ usr / lib或此類目錄中的相應共享庫(* .so)替換它們並重新生成ldcache。 生成緩存后,它們應顯示在ldconfig -p
輸出中。
如果要添加要包含在ldconfig ldcache生成中的新路徑,可以將它們添加到/etc/ld.so.conf文件中。 然后,下次生成ldcache時,它將在這些目錄中搜索您的共享對象。 您也可以將它們放在/ lib或/ usr / lib目錄中。 我建議不要這樣做。 相反,我建議使用/ usr / local / lib目錄。 它通常位於ldcache路徑中,旨在與用戶生成的共享庫一起使用。
希望有所幫助
請參閱: http : //linux.die.net/man/8/ldconfig
請參閱: http : //linux.die.net/man/1/ldd
最后,“locate”命令對於查找任何路徑中的文件很有用。 它使用經常更新的數據庫,因此如果文件已存在一段時間,它可能位於locate數據庫中。
您可以搜索如下文件:
locate libstdc++.so.6
如果文件最近已添加到路徑中且不在locate數據庫中,則可以運行updatedb
以重新生成locate數據庫。 然后,您應該能夠在文件系統上找到任何文件。
有關此主題的更多信息,我建議您閱讀本書: http : //www.network-theory.co.uk/docs/gccintro/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.