簡體   English   中英

C ++共享庫

[英]C++ shared libraries

我試圖弄清楚共享庫在c ++ UNIX環境中的工作方式。 我了解我們在編譯代碼時只需要頭文件,而無需共享庫規范。 但是,如果要從編譯的文件中創建可執行文件或共享庫,是否需要指定共享庫依賴項(這些依賴項是動態的)? 共享庫的路徑是否需要在運行時加載時匹配路徑?

我正在使用Linux 2.6.18-164.11.1.el5#1 SMP x86_64 GNU / Linux

我遇到了一個問題,我的代碼無法在運行時拾取庫。 我嘗試設置LD_LIBRARY_PATH和PATH。 但是在運行該可執行文件時,在運行時出現以下錯誤:錯誤:librc.so:無法打開共享庫文件:沒有這樣的文件或目錄

山姆

標頭僅用於編譯階段。 在鏈接時,通常必須指定要鏈接到的共享庫。 您可能會看到-L選項來設置共享庫所在的位置,和/或-l指定要鏈接的庫。 通常,在命令行上還會有一個開關來提醒鏈接器有關您使用的是libs還是“常規”版本的線程安全版本,以及另一個用於指定動態鏈接的開關。

在運行時,無論您是啟動使用lib的程序,還是運行ldd來查找所需內容,操作系統都具有用於查找.so文件的系統,並且該版本可能因一個unix版本而異。 LD_LIBRARY_PATH變量指定在哪里查找.so文件,但可能不是完整的故事,具體取決於所討論的確切Unix版本。 另外,您可能不想在修改LD_LIBRARY_PATH之外隨意擺弄,因為它會帶來系統范圍的影響,因此只能扔掉外殼。 更好的選擇是檢查LD_LIBRARY_PATH設置的現有路徑中是否缺少“ .so”文件,如果不是,請嘗試將其副本放在該路徑中的某個位置。

在運行時,將搜索動態庫:

  • 在可執行文件中記錄的路徑中(在鏈接時帶有-rpath的Linux下,在帶有-R的Solaris下,在目錄名中使用$ ORIGIN可以指定相對於包含可執行文件的目錄的目錄)

  • 在LD_LIBRARY_PATH中(或等效名稱,有時會有64/32位變量)。 如果已在可執行文件中記錄了路徑,則可能不會搜索LD_LIBRARY_PATH(在Linux下,如果可執行文件已與選項--enable-new-dtags鏈接,則會在記錄的路徑后進行搜索;我現在不記得Solaris的行為)

  • 在一組與系統相關的目錄中(Linux允許在/etc/ld.so.conf中指定它們並具有緩存,請參閱ldconfig)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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