Linux C中如何导出链接库 详细教程(039) (linux c 导出链接库 039)

Linux C中如何导出链接库 详细教程

在Linux下使用C语言编写程序时,经常会使用库函数来简化程序的编写以及提高程序的运行效率。为了方便程序的开发和维护,我们可能需要将自己编写的一些函数封装成库函数,以方便在其他程序中调用。本文将详细介绍Linux C中如何导出链接库。

一、什么是链接库

链接库(Library)是将多个函数放在一起构成的、可被其他程序调用的二进制文件。链接库可分为动态链接库(Dynamic Library)和静态链接库(Static Library)两种类型。

静态链接库将库函数的代码完全复制到目标程序中,程序在运行时不需要再加载该库函数,因此程序的运行效率较高,但该库函数需要和程序一起发布,导致程序文件较大。

动态链接库则将库函数的代码存储在单独的文件中(通常为.so文件),程序在运行时需要先将该库函数加载到内存中才能运行库函数。这种方式可以使得程序文件较小,同时也方便库函数的更新和维护。

二、编写库函数

在编写库函数时,需要注意以下几点:

1.定义函数的接口和返回值类型,确保函数可以正确地被其他程序调用;

2.为了保证库函数的可重用性,需要保证函数的输入输出参数能够适应多种场景;

3.为了避免函数名冲突,应该给函数名添加前缀,例如lib_。

假设我们要编写一个库函数,该函数用于计算两个数的和。下面是实现代码:

“`

/*add.h*/

#ifndef ADD_H

#define ADD_H

int lib_add(int a, int b);

#endif

/*add.c*/

#include “add.h”

int lib_add(int a, int b)

{

return a + b;

}

“`

在上述代码中,我们定义了一个名为lib_add的函数,该函数的输入参数为两个整型数a和b,输出参数为它们的和。我们将该函数封装在了add.h和add.c两个文件中,以便其他程序调用。

三、生成链接库

在Linux下,生成链接库有两种方式:静态链接和动态链接。

1.静态链接

使用静态链接库时,链接器将被调用的库函数的代码复制到目标程序中,目标程序不需要再搜索库文件,这种链接方式生成的可执行文件较大,但可执行文件不依赖库文件,因此便于程序的移植。

生成静态链接库需要使用ar和ranlib命令,具体步骤如下:

1)编译库文件

在终端中输入以下命令:

“`

gcc -c -fPIC add.c

“`

选项含义:

-c:编译、汇编,但不进行链接。

-fPIC:产生位置无关代码,用于编译动态链接库

2)打包库文件

在终端中输入以下命令:

“`

ar -r libadd.a add.o

ranlib libadd.a

“`

ar与ranlib命令的作用是将目标文件打包成归档文件(Archive)。其中ar -r libadd.a add.o表示将add.o文件打包进libadd.a文件中,-r选项意味着在归档文件中插入一个或多个档案文件,并更新归档文件的目录(Table of Contents)。ranlib libadd.a用于更新归档文件的目录(TOC)以加快归档文件的访问速度。

打包之后生成了一个名为libadd.a的库文件,该文件可以被其他程序链接使用。

2.动态链接

动态链接库是指可重定位对象形式存放在系统中,在程序链接时只需记录库文件的路径和文件名,程序运行时再将库文件加载进内存中,因此该链接方式可以方便程序库的更新或移植。

生成动态链接库同样需要编译和打包两个步骤,具体步骤如下:

1)编译库文件

在终端中输入以下命令:

“`

gcc -shared -fPIC -o libadd.so add.c

“`

选项含义:

-shared:编译成共享库,即动态链接库

-o:指定输出文件

2)将库文件拷贝到系统库目录中

在终端中输入以下命令:

“`

sudo cp libadd.so /usr/lib

sudo ldconfig

“`

上述代码会将libadd.so动态链接库文件拷贝到/usr/lib目录下,并使用ldconfig命令将库文件包含到共享库的动态链接器路径列表中。

四、使用链接库

使用链接库需要先在程序中添加头文件,然后在链接时引用库文件。

1.静态链接库

使用静态链接库时,需要在编译时引用库文件,具体步骤如下:

在终端中输入以下命令:

“`

gcc -o mn mn.c -L. -ladd

“`

选项含义:

-o:指定输出文件名

-L:指定链接库文件路径

-l:指定链接库文件名,生成的可执行文件中将包含该库的代码

其中,-L.表示链接器在当前目录中查找库文件,-ladd表示链接libadd.a库文件。

2.动态链接库

使用动态链接库时,程序运行时将加载库文件,具体步骤如下:

在终端中输入以下命令:

“`

gcc -o mn mn.c -L. -ladd

“`

选项含义:

-o:指定输出文件名

-L:指定链接库文件路径

-l:指定链接库文件名,生成的可执行文件中将包含该库的代码

其中,-L.表示链接器在当前目录中查找库文件,-ladd表示链接libadd.so库文件。

五、

本文详细介绍了Linux C中如何导出链接库。在编写库函数时,需要注意输入输出参数的适应性以及命名规范。在生成链接库时,分为静态链接和动态链接两种方式,需要使用不同的命令,生成的库文件也有不同的特点。在链接时需要指定库文件路径和库文件名,并在程序中添加头文件以供调用。

相关问题拓展阅读:

  • linux下c语言连接Mysql
  • 关于 Linux c 的函数库文件的 路径问题

linux下c语言连接Mysql

#include “/usr/local/mysql/include/mysql/mysql.h” /*为绝对路径*/

#include

int main()

{

char *user = “vod”, *pwd = “vod”, *dbname = “vod”, *host=”211.161.159.106″;

MYSQL mysql;

MYSQL_RES *mysql_ret;

MYSQL_ROW mysql_row;

unsigned long num_rows;

int ret;

mysql_init(&mysql);

if(mysql_real_connect(&mysql,host,user,pwd,dbname,0,NULL,0))

{

printf(“Connection success!\n”);

ret = mysql_query(&mysql,”select * from user”);

if(!ret)

{

printf(“Query Success!\n”);

mysql_ret = mysql_store_result(&mysql);

if(mysql_ret != NULL)

{

printf(“早姿没Store Result Success!\n”);

num_rows = mysql_num_rows(mysql_ret);

if(num_rows != 0)

{

printf(“%d\n”,num_rows);

while(mysql_row = mysql_fetch_row(mysql_ret))

{

printf(“%s\t%s\t%s\t%s\t%s\t%s\n”,mysql_row,mysql_row,mysql_row,mysql_row,mysql_row,mysql_row);

}

}

else

{

printf(“mysql_num_rows Failed!\n”);

return(-1);

}

mysql_free_result(mysql_ret);

return(0);

}

else

{

printf(“Store Result Failed!\n”);

return(-1);

}

}

else

{

printf(“Query Failed!\n”);

return(-1);

}

}

else

{

printf(“Connection Failed\n”);

return(-1);

}

}

自己看吧,写的我累死了陆纳,运行没问题的。流程都在里面了。你会用GCC编译器编译它吧?(废话,呵呵,不过注意带几个mysql下的动态链接库册掘)

老大,原来你连 C 的原理都不会啊?

C 语言所有顷游调用函数毁伍,都要有声明,这种外部函数库的调用,都要用他们的 header 文件来声明函数变量等等的东西,编译器会根据实际情况去把这些程序里面的函数调用链接到函数库的正确位置上。

微软的产品因为他垄断了他自己系统的所有功能设计。所以他的系统+他的开发程序+他的开发函数库就不需要 header 文件了,因为它可以设计为 dll 本身含有足够的信息去干别的事情了。所以,你别以为你用了微软的 .net ,他就还是 C 语言了。他已经脱离了 C 语言的范围了。

GCC一般情况下是编译器,但编译器是不够的,还需要连接器的工作才行。binutils 里面的软件提供相关的功能。

要知道以前链接到函数库功能,光有 header 和函数库文件本体还是不行的,还需要另外的函数库信息文件来帮助编译器连接器来找到正确的函数入口位置才行的。

你编程 C ,你要选择你所使用的功能调用方法,GCC 一般调用 mysql 有调用外部 dll ,或者程序自己直接链接 mysql 端口,自己分析 mysql 服务进程发送的各种信息!

前一种办法,可以直接选择 mysql 客户端里面的 SDK 来直接获得官方的功能支持,但官方 MySQL 是 GPL 协议发布的,你使用他的功能接口后,你的程序也必须以 GPL 发布,不然你就要去选择其他的函数库,比如 ODBC 的 mysql 库。当然还有第三方的 mysql 功能库可以选择。

不过你要注意,LGPL 必须严格区分你的程序和 LGPL 代码。你必须动态链接到纤乎或 LGPL 函数库。如果你的程序包含 LGPL 函数库一起发布,且 LGPL 库是你的软件的必备函数库,那么你的程序也必须开源,但不是 GPL 而是 LGPL !

不然你就选择自己写程序直接与 mysql 服务器进行数据传输,不使用第三方功能库。

但我不认为身为一个 Linux 下程序开发人员,会去傻傻的自己写功能函数而不是用现成的函数库。

你所遇到的“非要客户安装 mysql client ”,就是因为你的软件调用了一些非你自己编写的函数调用功能,而为了获取这些函数而需要安装几个 mysql 函数库的问题。

这个问题我想不应该是一个开发人员提出来的吧?

楼主你还是重新学习 C 语言吧。.net 的 C 被微软改的不是真正的 C 语言了,所以你没办法按照 C 的标准去比较 .net 和 GCC 的。

而且很多 .net 的编程习惯也没办法延续到 GCC 的。

和.net同样的道理,你在誉历局银.net也需要在你的部署包中包含dll才能去连接,除非你静态联接了相关的code, 在linux下你需要下载mysql的C库开发包(libmysql++-dev libmysql++2c2a libmysqlclient15-dev libmysqlclient15off) 这里面已经包含了动态库和静态库,如果是静态库链接,你就庆腊搜只需要把你的程序部署给别人即可,如果是动态链接,还需要把相关的.so也包含在你的部署包中分发给使用者

关于 Linux c 的函数库文件的 路径问题

要学会用瞎核宴man,特别是man 氏橘2(系统调用)和man 3(C函数库),比如:

man sqrt

会显示需要引用的头文件,编译时需要的动态链接库

如果重复,则需要指定手册章节,比如

man write 显示的是write程磨银序帮助,如果想看系统调用,则要输入man 2 wirte

另外,/lib64:/lib:/usr/lib64:/usr/lib这些是系统缺省的,不用指定

求神帮助我想找string库哪目录我想看看函数定义

关于linux c 导出链接库 039的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

原创文章,作者:admin,如若转载,请注明出处:https://www.vaicdn.com/news/191445.html

(0)
admin
上一篇 2024 年 4 月 29 日
下一篇 2024 年 4 月 29 日

相关推荐