Linux动态库编译和使用详细剖析

重点讲述Linux上使用gcc编译动态库的一些操作,并且对其深入的案例分析。最后介绍一下动态库插件技术, 让代码向后兼容。关于Linux上使用gcc基础编译,预编译,编译,生成机械码最后链接输出可执行文件流程参照下面。

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

测试结果如下

Linux动态库编译和使用详细剖析

测试完成,那就开始静态库到动态库扩展之旅.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e8bc6915c791557c75ab63566b0acea2.html