引言
重點講述Linux上使用gcc編譯動態庫的一些操作,並且對其深入的案例分析。最後介紹一下動態庫插件技術, 讓代碼向後兼容。關於Linux上使用gcc基礎編譯,預編譯,編譯,生成機械碼最後鏈接輸出可執行文件流程參照下面。
GCC編譯流程 http://www.linuxidc.com/Linux/2016-03/129631.htm
而本文重點是分析動態庫相關的知識點. 首先看需要用到的測試素材
heoo.h
#ifndef _H_HEOO
#define _H_HEOO
/*
* 測試接口,得到key內容
* : 返回key的字符串
*/
extern const char* getkey(void);
/*
* 測試接口,得到value內容
* arg : 傳入的參數
* : 返回得到的結果
*/
extern void* getvalue(void* arg);
#endif // !_H_HEOO
heoo-getkey.c
#include "heoo.h"
/*
* 測試接口,得到key內容
* : 返回key的字符串
*/
const char*
getkey(void) {
return "heoo-getkey.c getkey";
}
heoo-getvalue.c
#include "heoo.h"
#include <stdio.h>
/*
* 測試接口,得到value內容
* arg : 傳入的參數
* : 返回得到的結果
*/
const void*
getvalue(void* arg) {
const char* key = "heoo-getvalue.c getvalue";
printf("%s - %s\n", key, (void*)arg);
return key;
}
heoo.c
#include "heoo.h"
#include <stdio.h>
/*
* 測試接口,得到key內容
* : 返回key的字符串
*/
const char*
getkey(void) {
return "heoo.c getkey";
}
/*
* 測試接口,得到value內容
* arg : 傳入的參數
* : 返回得到的結果
*/
const void*
getvalue(void* arg) {
const char* key = "heoo.c getvalue";
printf("%s - %s\n", key, (char*)arg);
return key;
}
main.c
#include <stdio.h>
#include "heoo.h"
// 測試邏輯主函數
int main(int argc, char* argv[]) {
// 簡單的打印數據
printf("getkey => %s\n", getkey());
getvalue(NULL);
return 0;
}
到這裡也許感覺有點臃腫, 但是理解為什麼是必要的. 會讓你對於動態庫高度高上0.01毫米的.哈哈.
先讓上面代碼跑起來.
gcc -g -Wall -o main.out main.c heoo.c
測試結果如下
測試完成,那就開始靜態庫到動態庫擴展之旅.
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-03/129632p2.htm