2017-12-27 325 views
0

GCC(鏈接)是否在用絕對路徑指定時找不到庫。請注意,我想要這樣做的原因是我有一個構建系統,可以通過絕對路徑解決所有庫問題,因此它可以保留一組有序的唯一條目。指定具有絕對路徑的庫的GCC行爲是什麼

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

我看到一個bug報告,其中有些人認爲這是一個錯誤,和其他人認爲它曾經工作過的事實是一個錯誤,這是固定的。

有一些討論,一個曾與一個先於道「:」

反正沒能正常工作。

因此,爲了在構建系統中進行測試,我將代碼放在絕對庫路徑中,如果它的「前綴」與指定給GCC的任何庫路徑匹配並截斷絕對庫路徑。

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

這工作。
我也試過這個。

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

它工作。 9(雖然調查..看起來像這是在構建腳本中的錯誤)

似乎如果任何指定爲GCC的搜索路徑是指定一個絕對路徑的庫的「前綴」,它會找到該庫。我還假定它需要在提供的庫路徑的有序列表中的第一個命中。

所以我的問題。

  • 這種支持行爲?
  • 這是更好的截斷構建腳本中的絕對庫路徑或通過絕對路徑。

我啓事帶來了一些相關的問題在這裏:

How to link using GCC without -l nor hardcoding path for a library that does not follow the libNAME.so naming convention?

這表明「非搜索」完整路徑是「燒」到可執行從而覆蓋所有運行時庫路徑當它是執行?它是否正確 ?如果是這樣,則意味着在命令行上指定具有完整路徑的庫是不合適的。部署時,構建的應用程序和關聯的庫將安裝在標準的可搜索位置。

回答

1

我想在這種情況下說的不使用-l,只是通過完整的庫路徑作爲命令的一部分: GCC(其他選項)/path/to/library.so

+0

這意味着它將通過查看後綴來確定它是一個庫嗎? – peterk

+0

@peterk:不,Unix通常不支持文件。它將通過查看文件的結構來確定它是一個庫。 –

+0

@MartinBonner GCC不會自動查找相應的存根'.a'文件嗎? – user0042

0

注:此是與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) 

有了這個信息 - (顯然)知道它做什麼,現在我可以繼續前進!

相關問題