2014-02-06 19 views
0

我知道共享庫靜態庫之間的區別。我試圖找出不同的gcc標誌/選項在linux上構建它們。我有人的makefile它創建了一個.so文件。我只是改變了輸出文件名的擴展名。然後我得到靜態庫文件,.a文件。我測試了它。有效。構建.so和.a庫時的任何不同標誌?

我認爲這可能不是那麼簡單。可能還有其他需要改變的地方。我不僅要求這個案子。總體來說,我是問有沒有什麼區別選項/標記什麼時候生成.so和什麼時候生成.a

原來的命令是這樣的:

CFLAGS= $(INCLUDE) $(WARN) -Wall 

libMyLibrary.so: MyLibrary.c MyLibrary.h 
    $(CC) -fPIC -o $(LIB_SRC_ROOT)/libMyLibrary.so -shared    MyLibrary.c $(CFLAGS) 

回答

2

要構建一個共享庫,你需要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可以選擇創建一個薄檔案,其中包含一個符號索引和引用成員文件的原件的檔案。這對於構建在本地構建樹中使用的庫非常有用,其中可重定位對象應保持可用,並且複製每個對象的內容只會浪費時間和空間。


的最佳做法,以防止損壞的建立是把所有的編譯器選項(例如CPPFLAGSCXXFLAGS)在一個單獨的.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 ...,$^)

相關問題