簡體   English   中英

指定具有絕對路徑的庫的GCC行為是什么

[英]What is GCC behavior for specifying libraries with absolute paths

GCC(鏈接)抱怨說,使用絕對路徑指定時找不到庫。 請注意,我要這樣做的原因是我有一個構建系統,該系統可以通過絕對路徑來解析所有庫,因此它可以保留有序的唯一條目集。

g++ (...) -l/path/to/library.so

我看到了一個錯誤報告,其中一些人認為這是一個錯誤,而其他人則認為它曾經起作用過的事實是一個錯誤,並且已得到修復。

有人討論,必須在路徑前加上“:”

無論如何沒有使它工作。

因此,要在構建系統中進行測試,我將插入代碼以截斷絕對庫路徑(如果它的“前綴”與指定給GCC的任何庫路徑匹配)並截斷絕對庫路徑。

g++ (...) -L/path/to -llibrary.so

這工作了。
我也試過了。

g++ (...) -L/path/to -l/path/to/library.so

而且有效。 9(盡管調查..看起來這是構建腳本中的錯誤)

似乎為GCC指定的任何搜索路徑都是使用找到該庫的絕對路徑指定的庫的“前綴”。 我還假定它在提供的庫路徑的有序列表中排在第一位。

所以我的問題。

  • 這是受支持的行為嗎?
  • 最好在構建腳本中截斷絕對庫路徑或傳遞絕對路徑。

我注意到這里提出了一些相關問題:

對於不遵循libNAME.so命名約定的庫,如何使用不帶-l或無硬編碼路徑的GCC進行鏈接?

這表示“非搜索”完整路徑已“燒入”可執行文件,從而在執行時覆蓋了任何運行時庫路徑? 這個對嗎 ? 如果是這樣,則不適合在命令行上使用完整路徑指定庫。 部署后,已構建的應用程序和關聯的庫將安裝在標准可搜索位置。

我會說在這種情況下不要使用-l,只需將完整的庫路徑作為命令的一部分傳遞:gcc(其他選項)/path/to/library.so

注意:這是與gcc(Raspbian 4.9.2-10)4.9.2一起使用的,我正在為此建立一個庫集。

好的-大量嘗試並測試不同的案例

使用完整路徑作為GCC的參數顯然會燒錄到庫的硬編碼絕對路徑,該絕對路徑在運行時用於解析它的位置。 不需要這樣做,因為該應用程序打算與可能在不同位置出現的可搜索共享庫一起部署。

-llibmyLib.so   does not work with a search path. 
-lmyLib         does work with a search path 
     ( with lib prefix and suffix removed - apparently 
       it tries all available suffi and prepends "lib" for it's 
       search by default )

-

-l:libmyLib.so   DOES work with a search path, 
               as ':' specifies the file name is not to be altered.

-l:debug/libmyLib.so DOES work ( a  subdir under the search path )
-l:release/libmyLib.so DOES work ( a subdir under the search path )

有了這個信息-(顯然)知道了它的作用,現在我可以前進了!

暫無
暫無

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

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