Linux生成静态库和动态库和导出指定函数及使用方法

15 篇文章 0 订阅

一、Linux生成动态库

  • 两步生成动态库
1.gcc  -fPIC -c test.c  
2.gcc -shared -o libtest.so test.o   
  • 一步生成动态库
gcc -shared -fPCI -o libtest.so test.c

二、Linux生成静态库

1. 生成目标文件
	gcc -c test.c
2.生成静态库
	ar -r libtest.a test.o

ar参数:

-a :把新的目标文件(*.o)添加到静态库文件中现有文件之后;
-b :把新的目标文件(*.o)添加到静态库文件中现有文件之前;
-d :从指定的静态库文件中删除文件;
-m:把文件移动到指定的静态库文件中;
-p :把静态库文件中指定的文件输出到标准输出;
-q :快速地把文件追加到静态库文件中;
-r :把文件插入到静态库文件中;
-t :显示静态库文件中文件的列表;
-x :从静态库文件中提取文件;
-v :使用详细模式

三、导出指定函数

如果你test.c中有多个函数,但是不想没一个函数都让别人使用,那么就需要导出指定函数列表,和winodws下的模块定义.def文件和__declspec(dllexport)似的,那么如何做呢?
有四种方法:

  1. 在方法声明定义时,加修饰:attribute((visibility(“hidden”)))

就是说将不公开的函数都加上这个属性,没加的就是可见的

  1. gcc 在链接时设置 -fvisibility=hidden,则不加 visibility声明的都默认为hidden; gcc默认设置 -fvisibility=default,即全部可见;

在gcc中加了这个设置之后表示所有的函数都是对外不可见了,然后在代码里面对于想公开的函数加上 attribute((visibility(“default”)))

  1. 使用链接参数 –retain-symbols-file 控制静态符号表,–version-script 控制动态符号表

则除了export_func外,全部为内部可见;

  1. 使用libtool的export-symbols选项

本人推荐使用第三种,其他自行查询使用。
如你有代码如下:

#include <stdio.h>
#include "test.h"
void fun1()
{
	printf("fun1\n");
}
void fun2()
{
	printf("fun2\n");
}

libtest.map

{
global:
	fun1();
local:  *;
};

libtest.sym

fun2()

编译动态库:

gcc c -fPIC -shared -o libtest.so test.c -Wl,--retain-symbols-file=libtest.sym -Wl,--version-script=libtest.map

在这里插入图片描述
显而易见:动态符号表中是函数func_1,静态符号表中是func_2
动态符号表 (.dynsym)和静态符号表(.symtab)主要区别是

动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。而 静态符号表(.symtab) 则保存所有符号,包括 .dynsym 中的符号。
详细介绍请移步:
https://blog.csdn.net/farmwang/article/details/72847529?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
或者自行百度。

四、使用动态库和静态库

  1. 使用动态库
    把生成好的动态库libtest.so放到和待测试的程序同一级目录下
g++ -o testSO testSO.c 	-L. -ltest
或者
g++ -o testSO testSO.c 	-L. libtest.so

如有有环境变量/usr/lib 或者/usr/lib64
可以把libtest.so放到里边

g++ -o testSO testSO.c 	 -ltest
  1. 使用静态库
    把生成好的静态库libtest.a放到和待测试的程序同一级目录下
g++ -o testSO testSO.c 	-L. -ltest
或者
g++ -o testSO testSO.c 	-L. libtest.a

如有有环境变量/usr/lib 或者/usr/lib64
可以把libtest.so放到里边

g++ -o testSO testSO.c 	 -ltest

提示:我一般都是把需要连接的库(动态库或者静态库)放到当前目录下,不放到/usr/lib或者/usr/lib64,如果放到当前目录下需要添加环境变量,因为在运行的时候需要找到这个动态库,根据需要自行修改就可以了。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态库静态库的编写方式基本相同,只是在编译链接时需要采用不同的方式。以下是C++动态库静态库的编写方法: ### 静态库 1. 创建静态库项目:打开Visual Studio,选择“新建项目”,然后选择“Win32控制台应用程序”,输入项目名称和路径,点击“确定”按钮。在弹出的窗口中选择“静态库”类型,然后点击“下一步”按钮,最后点击“完成”按钮。 2. 编写库文件代码:在项目中添加源文件,编写库文件的代码,并在头文件中声明需要导出函数和类。 3. 生成静态库文件:在编译链接时将代码编译成静态库文件,可以手动编译或在Visual Studio中配置。在Visual Studio中,可以选择“生成”菜单中的“生成解决方案”或“生成项目”命令生成静态库文件。生成静态库文件通常以.lib为扩展名。 4. 使用静态库:在使用静态库的应用程序中,需要在编译链接时将静态库文件链接到可执行文件中。可以在应用程序的项目属性中配置链接选项,将静态库文件添加到链接器的附加依赖项中。在代码中包含头文件即可使用静态库中的函数和类。 ### 动态库 1. 创建动态库项目:打开Visual Studio,选择“新建项目”,然后选择“Win32控制台应用程序”,输入项目名称和路径,点击“确定”按钮。在弹出的窗口中选择“动态链接库(DLL)”类型,然后点击“下一步”按钮,最后点击“完成”按钮。 2. 编写库文件代码:在项目中添加源文件,编写库文件的代码,并在头文件中声明需要导出函数和类。需要使用__declspec(dllexport)关键字将需要导出函数或类标记为可导出。 3. 生成动态库文件:在编译链接时将代码编译成动态库文件,可以手动编译或在Visual Studio中配置。在Visual Studio中,可以选择“生成”菜单中的“生成解决方案”或“生成项目”命令生成动态库文件。生成动态库文件通常以.dll为扩展名。 4. 使用动态库:在使用动态库的应用程序中,需要在运行时加载动态库文件,并使用GetProcAddress函数获取动态库中需要使用函数或类。在代码中包含头文件即可使用动态库中的函数和类。在编译链接时需要指定动态库文件的路径和名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值