爲了背景,我創建了一些使用動態加載的共享庫插件進行硬件輸出的C++軟件(具體細節與此無關)。創建最小共享庫
我構建的可執行文件將所有內容編譯爲對象文件,然後鏈接所需的對象,這很簡單,使用排除列表。然後,我可以通過指定其主要目標文件(在運行時動態加載和訪問的文件)以及主要目標文件引用的每個其他目標文件來構建共享庫。
我的問題是這樣的:有沒有辦法提供鏈接器的主要目標文件,並創建一個共享庫,只包含它依賴的對象?所有的目標文件都在同一個目錄下,我沒有使用Makefile(但是,如果可以解決問題,這是一個有效的答案),編譯速度不是問題。
我已經查看了連接器選項--as-needed
,--gc-sections
和--no-undefined
,但我還沒有能夠拼湊一個工作的構建過程。
示例:對於源文件main.cpp
,a.cpp
,b.cpp
,a.h
,並b.h
,其中main.cpp
和a.cpp
既包括b.h
:
gcc -fPIC -c *.cpp -I.
構建對象文件main.o
,a.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
中?
在我看來,你的整個問題來自未明確列出哪些文件進入了什麼。我建議使用autotools,CMake,一個普通的舊Makefile,甚至是一個shell腳本。但是用一些東西。 –
我目前使用的是一個shell腳本,它沒有明確列出(大多數)文件;問題是插件是可以互換的,但是所有的插件都與主可執行文件構建在同一個目錄中,所以如果我不使用依賴關係的話,我最終會在共享庫中添加一些額外的對象。 – Techwolf