Linux 下配置Tinyxml,將其編譯爲動態庫



                             在我的上一篇博文中,講到如何把Tinyxml 在Linux下編譯爲靜態庫,從而使用這個靜態庫來進行XML編程。但是,如果我想使用動態庫來進行XML編程,因爲使用動態庫生成的可執行文件更小,更節省內存。那麼,應該怎麼做呢,很簡單,只需要修改上一篇博文中的步驟(2)和步驟(4):


                             步驟(2):將其中的註釋爲Targets of the build的下一行OUTPUT := xmltest一行修改爲:OUTPUT := libtinyxml.so

                             步驟(4):將其中的註釋爲Output的下一行的${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改爲:在"${LD}"後面加一個參數:-shared用於生成動態庫。


                                                接下來,我們就來分析下爲什麼對Makefile進行上述操作就能生成靜態庫和動態庫,首先,舉個例子來看看怎麼生成簡單的庫文件:

                       以linux下的靜態庫和動態庫爲例

                       靜態庫:
                       先將源文件編譯成目標文件:gcc  -c  test.c  test1.c
                       生成靜態庫:ar  -rc libstatic.a test.o  test1.o

                       共享庫:
                       先將源文件編譯成目標文件:gcc  -c  test.c  test1.c
                       生成共享庫:gcc -fPIC -shared -o libshared.so test.o test1.o  //f後面跟一些編譯選項,PIC是其中一種,表示生成位置無關代碼(Position Independent Code)一般用在編譯動態庫的時候

                      

                       ar命令可以用來建立或修改備存文件,或是從備存文件中抽取文件,詳細用途可以到網上查。通過上面的小實例,再加上如果你瞭解Makefile的規則和使用,那麼相信你已經明白爲什麼要這樣修改Makefile了。我把Makefile主要的內容粘貼下來分析:
CC     := gcc
CXX    := g++
LD     := g++
AR     := ar rc
RANLIB := ranlib

#****************************************************************************
# Targets of the build
#****************************************************************************

OUTPUT := xmltest

all: ${OUTPUT}
                            

#****************************************************************************
# Source files
#****************************************************************************

SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp

# Add on the sources for libraries
SRCS := ${SRCS}

OBJS := $(addsuffix .o,$(basename ${SRCS}))

#****************************************************************************
# Output
#****************************************************************************

${OUTPUT}: ${OBJS}
    ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}

             從上面分析可以看出OUTPUT爲最終的目標,因此修改OUTPUT變量的值可以改變最終生成的文件的名字,改爲libtinyxml.a則生成的文件名就爲libtinyxml.a。而OUTPUT的生成則依賴於OBJS變量,和下面的命令:${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS},由LD     := g++可以看出,LD變量爲g++命令,因此在${LD}後加上一個-shared選項,就可以生成動態庫文件。由AR     := ar rc可以看出,AR變量爲ar命令,因此把${LD}改爲${AR},並且把-o選項刪除,就可以生成靜態庫文件。

             現在,通過上面的分析,再加上如果你已經瞭解Makefile的規則和使用,相信原因應該已經明瞭。那麼,如果我想把Tinyxml移植到嵌入式開發平臺下,那麼該如何修改Makefile呢,很簡單,只需要再把CXX    := g++改爲CXX    :=arm-linux-g++,即把編譯器改爲交叉編譯器。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章