重点讲述Linux上使用gcc编译动态库的一些操作,并且对其深入的案例分析。最后介绍一下动态库插件技术, 让代码向后兼容。关于Linux上使用gcc基础编译,预编译,编译,生成机械码最后链接输出可执行文件流程参照下面。
而本文重点是分析动态库相关的知识点. 首先看需要用到的测试素材
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
测试结果如下
测试完成,那就开始静态库到动态库扩展之旅.