第四章 如何生成動態、靜態鏈接庫并使用
一、如何生成動態鏈接庫并使用
1、生成動態鏈接庫
在第三章創建的PRoject1工程里面把main.cpp的main函數名更名為maina。
打開project1.pro,將TEMPLATE = app改為TEMPLATE = lib。
執行“qmake”生產新的Makefile,再執行“make”編譯。
編譯過程中用ln指令生產了動態鏈接庫的軟鏈接文件。make編譯工程時,就執行“ln -s”建立指向libproject1.so.1.0.0的3個軟鏈接文件(libproject1.so,libproject1.so.1和libproject1.so.1.0)。程序在鏈接動態庫時,默認搜索“.so”后綴的文件,因而為了能使用這些庫,需要建立指向它們的軟鏈接(鏈接名以.so為后綴),這就是工程編譯的時候建立軟鏈接的意義。
2、使用動態鏈接庫
當第三方程序鏈接庫libproject1.so時,調用maina即可繪制出一個軟件界面。細節都在庫中實現了,使用者只需調用接口。執行下面指令:
在mylib.h輸入以下代碼保存
庫和庫的接口定義文件都齊備了,接下來在testlib目錄下編寫使用這個庫的測試代碼test.cpp,內容如下:
最后就是編譯測試
"-I"來指定庫的頭文件搜索路徑;“-L”指定動態庫所在的路徑;“-lproject1”告訴編譯器具體找哪個庫,注意:我們寫的是“-lproject1”,并不是“-llibproject1”,能這樣寫也是因為linux對動態鏈接庫命名的偏好(必須以“lib”3個字母開頭)引起的。在用“-l”指定要鏈接的庫文件名時,可以簡寫為“-lproject1”而不用寫全。
執行.test時出現上面錯誤提示,提示找不到動態鏈接庫,執行“ldd ./test”,查看一下test用到的動態鏈接庫都有哪些。
可以看到“libproject1.so.1 => not found”,而程序用到的其他的庫,如libc.so.6在“/lib”目錄下,libstdc++.so.6在“/usr/lib”下可以找到。這兩個路徑(/lib和/usr/lib)正是Linux動態庫的默認搜索路徑。自己做的動態鏈接庫(libproject1.so.1)需要復制到默認搜索路徑里面,當應用程序執行是需要用到動態鏈接庫里面的接口(maina),系統會自動地到默認搜索路徑去找相應的動態庫,然后把找到的動態鏈接庫載入內存供應用程序使用。
通過加載環境變量(LD_LIBRARY_PATH)來指定動態庫搜索路徑。
之前的軟件界面出來了。
二、如何生成靜態鏈接庫并使用
1、生成靜態鏈接庫
在第三章創建的project1工程里面打開project1.pro,在里面添加一條語句“CONFIG += staticlib”。
執行“qmake”生產新的Makefile,再執行“make”編譯生成靜態鏈接庫libproject1.a。
2、使用靜態鏈接庫
在建立的testlib目錄下創建teststaticlib目錄,把生成的靜態鏈接庫(libproject1.a)和前面創建的mylib.h頭文件以及測試代碼test.cpp復制到teststaticlib目錄下,執行“qmake -project”生成工程文件teststaticlib.pro,編譯該文件,添加“LIBS += -L ./ -lproject1”,指定libproject1.a搜索路徑,之后重新生成Makefile,編譯運行工程,可以看到那個界面有蹦出來了。
新聞熱點
疑難解答