簡體   English   中英

Linux C ++ LD_LIBRARY_PATH抑制標准庫

[英]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我也嘗試將輸出寫入一個在設置路徑之前工作的文件。

非常感謝

UPDATE

感謝您的回復(請參閱下面的評論結果)

基於@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM