2015-08-16 162 views
1

爲了背景,我創建了一些使用動態加載的共享庫插件進行硬件輸出的C++軟件(具體細節與此無關)。創建最小共享庫

我構建的可執行文件將所有內容編譯爲對象文件,然後鏈接所需的對象,這很簡單,使用排除列表。然後,我可以通過指定其主要目標文件(在運行時動態加載和訪問的文件)以及主要目標文件引用的每個其他目標文件來構建共享庫。

我的問題是這樣的:有沒有辦法提供鏈接器的主要目標文件,並創建一個共享庫,只包含它依賴的對象?所有的目標文件都在同一個目錄下,我沒有使用Makefile(但是,如果可以解決問題,這是一個有效的答案),編譯速度不是問題。

我已經查看了連接器選項--as-needed,--gc-sections--no-undefined,但我還沒有能夠拼湊一個工作的構建過程。

示例:對於源文件main.cppa.cppb.cppa.h,並b.h,其中main.cppa.cpp既包括b.h

gcc -fPIC -c *.cpp -I.構建對象文件main.oa.o,和b.o

gcc -o main.out *.o從目標文件... 構建最終可執行文件main.out,其中包括未使用的a.o。--gc-sections應該解決這個問題。)

gcc -fPIC -shared -o a.so a.o -Wl,--as-needed !(a).o從所有的目標文件的建立最終的共享庫a.so ... 包括main.o中,這是未使用的。如何防止main.o被包含在a.so中?

+1

在我看來,你的整個問題來自未明確列出哪些文件進入了什麼。我建議使用autotools,CMake,一個普通的舊Makefile,甚至是一個shell腳本。但是用一些東西。 –

+0

我目前使用的是一個shell腳本,它沒有明確列出(大多數)文件;問題是插件是可以互換的,但是所有的插件都與主可執行文件構建在同一個目錄中,所以如果我不使用依賴關係的話,我最終會在共享庫中添加一些額外的對象。 – Techwolf

回答

1

有沒有辦法給鏈接器提供主目標文件,並創建一個只包含它所依賴的對象的共享庫?

是:包中的所有對象到歸檔庫liball.a,然後鏈接是這樣的:

gcc -shared -o a.so a.o liball.a 

連接器將然後從liball.a地拉出a.o依賴於所有對象,只有這些對象如解釋here所述。

注意:liball.a可能包含a.o,沒有任何傷害(如上面的鏈接說明)。

更新:

有沒有辦法做到這一點,而不需要先創建一個檔案?

我不知道任何便攜式的方式來做到這一點。Gold linker--start-lib--end-lib命令行標誌achieve exactly that

+0

這似乎正是我想要的;我的目標是創建一個包含'a.o'及其依賴的共享庫(對不起,這有點不清楚)。有沒有辦法做到這一點,而無需首先創建存檔? – Techwolf