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
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