1. 程式人生 > >QtEmbedded-4.8.6-arm 從動態庫到靜態庫-釋出小記

QtEmbedded-4.8.6-arm 從動態庫到靜態庫-釋出小記

    以前是動態庫,現在要換成靜態庫。步驟如下。

   1.重新配置編譯器。

在autoconf.sh指令碼中,將-release -shared修改 -release -static 。

./autoconf.sh

make clean

make -j16

make install

可以看到路徑中的靜態庫 libQtCore.a  libQtGui.a  libQtMultimedia.a  libQtNetwork.a  libQtSql.a  libQtTest.a  libQtXml.a,然後將這些需要用到的靜態庫拷貝到工程資料夾中,專案需要的是 libQtCore.a  libQtGui.a libQtNetwork.a libQtXml.a (請不要先strip,會有錯誤)

2.將需要的靜態庫合併成一個靜態庫

        ar x libQtCore.a

        ar x libQtGui.a

        ar x libQtNetwork.a

        ar x libQtXml.a

     ar cru libQtMain.a *.o
ranlib libQtMain.a
rm *.o

3..pro修改

增加 CONFIG+=static (*後來發現是非必要)

如果有*.qrc資原始檔,需要修改程式碼。

Q_INIT_RESOURCE(graphlib);

(參考http://doc.qt.io/archives/qt-4.8/resources.html)

....../QtEmbedded-4.8.6-arm/bin.qmake  *.pro  (編譯生成Makefile)

4.編譯生成Makefile需要修改庫的路徑

LIBS          = $(SUBLIBS)  -L./ -lQtMain -lpthread -ldl -lrt -lm

(參考Makkefile原本的LIBS          

-ldl :會有以下錯誤

.//libQtMain.a(qlibrary_unix.o): In function `qdlerror()':

qlibrary_unix.cpp:(.text+0x10): undefined reference to `dlerror'
.//libQtMain.a(qlibrary_unix.o): In function `QLibraryPrivate::unload_sys()':
qlibrary_unix.cpp:(.text+0x130): undefined reference to `dlclose'
.//libQtMain.a(qlibrary_unix.o): In function `QLibraryPrivate::resolve_sys(char const*)':
qlibrary_unix.cpp:(.text+0x308): undefined reference to `dlsym'
.//libQtMain.a(qlibrary_unix.o): In function `QLibraryPrivate::load_sys()':
qlibrary_unix.cpp:(.text+0xc44): undefined reference to `dlopen'
collect2: error: ld returned 1 exit status
Makefile:106: recipe for target 'imagetest' failed

  -lrt:缺少該選項執行時會顯示libc.so.6錯誤

5.執行時依舊需要先source 環境變數(字型,外掛路徑)

全文參考 http://doc.qt.io/archives/qt-4.8/deployment.html