要構建一個共享庫,你需要ld
或你的編譯器鏈接(假設gcc
和GNU make使用):
gcc -shared -o [email protected] $(filter %.o,$^)
要建立一個靜態庫使用ar
:
ar cr [email protected] $(filter %.o,$^)
在上述$(filter %.o,$^)
靜態庫是在一個文件中只是一堆.o
文件。因此,當你建立一個,你有原始的.o
文件和它的副本.a
。如果你不打算重新分配.a
文件,你可能會喜歡的GNU AR薄存檔功能:
GNU AR可以選擇創建一個薄檔案,其中包含一個符號索引和引用成員文件的原件的檔案。這對於構建在本地構建樹中使用的庫非常有用,其中可重定位對象應保持可用,並且複製每個對象的內容只會浪費時間和空間。
的最佳做法,以防止損壞的建立是把所有的編譯器選項(例如CPPFLAGS
和CXXFLAGS
)在一個單獨的.mk
makefile文件和連接選項(例如LDFLAGS
)在一個又一個。然後有.o
文件也取決於compiler_flags.mk
;可執行文件,共享庫和檔案也取決於linker_flags.mk
。所以,當編譯器或鏈接標誌得到更新make
自動重新編譯和/或重新鏈接的目標,例如:
xyz.so : x.o y.o z.o linker_flags.mk
g++ -shared -o [email protected] ${LDFLAGS} $(filter %.o,$^)
x.o : x.cc compiler_flags.mk
g++ -c -o [email protected] ${CPPFLAGS} ${CXXFLAGS} $(filter %.cc,$^)
這就解釋了爲什麼在這些規則$(filter ...,$^)
。