aforge库源码编译-Linux下编译C++/C生成.a或.so库文件

最近由于阅读源码的工作,需要自己编译一些.so文件或者.a文件,查一些资料,写一些例子,记录一下。

静态库和动态库

一般程序编译的过程可以分为两个阶段:编译和链接。 在链接阶段,需要链接所有obj文件(.o)以生成可执行程序。 此过程可以链接其他外部库文件。 有时也有省略号。

gcc -c test.c        #源文件编译,生成 .o 文件
gcc -o test test.o   #将Obj文件链接,可以多个文件
#省略写法
gcc test.c            #默认生成 a.out
gcc -o test test.c    #两个阶段省略成一个

库文件中的具体实现对用户来说是透明的,它只提供功能性的功能,用户无法知道库文件喜欢你的源码实现。 如果您不想开源您的实现,您可以将该库提供给其他人使用。 库文件分为静态库文件和动态库文件:

aforge库源码编译-Linux下编译C++/C生成.a或.so库文件

静态库:一般来说是一个.a文件。 静态库是指在链接过程中将库文件的所有数据整合到目标代码中,使得生成的可执行文件在执行时不再需要外部库的支持aforge库源码编译,可以在那里运行。 这就导致静态库编译生成的可执行库文件较大,并且当需要更新和改变库文件时,也必须重新编译生成可执行文件。

动态库:一般是.so文件。 与静态库不同,动态库文件在链接时并不将所有代码实现都整合到目标代码中,而是只有当可执行程序执行到相应位置时,才能在库文件中查找相应的技能。 因此,动态库链接生成的函数比较少,而且当库文件更新时,只需要重新生成库文件,不需要重新编译可执行程序。 这给库文件的升级和更新带来了极大的方便。

库文件的编译和生成

静态库的编译和生成

aforge库源码编译-Linux下编译C++/C生成.a或.so库文件

编译生成静态库需要使用ar命令,链接过程参数-L表示库文件的路径,-l表示库文件的名称。 库文件的命名格式为lib{name}.a,name为库文件的名称。

写一个小测试程序,三个文件,funTest.c、funTest.h和testMain.caforge库源码编译,testMain.c调用库函数输出:

// funTest.h    头文件进行函数接口定义
#include     
void printa();        
//--------------------------------------------
// funTest.c    源文件中实现
#include "funTest.h"
void printa(){
    printf("print an");
}
//-------------------------------------------
// testMain.c 主程序文件,调用库函数
#include "funTest.h"
int main()
{
    printa();
    return 0;
}

三个文件的代码如上所示,编译过程如下所示。 写完后发现库文件的链接过程和.o文件类似。 乍一看似乎直接使用.o文件更方便,那么为什么不直接使用.o文件呢? 其实一般情况下,库文件都是第三方库,是由多个.o文件编译而成的。 。

aforge库源码编译-Linux下编译C++/C生成.a或.so库文件

# 正常情况下,就直接将object文件链接一起编译生成可执行程序就行了
gcc -c funTest.c
gcc -o testMain testMain.c funTest.o
# 库文件形式下
gcc -c funTest.c                                # 编译生成funa.o
ar -rsv libfunTest.a funTest.o                  # ar指令, 编译生成静态库文件
gcc -o testMain testMain.c -L./ -lfunTest       # 链接静态库文件,生成可执行文件

动态库的编译和生成

动态库通常称为.so文件,它对应于静态库。 动态库在编译和链接过程中并不编译所有代码。 编译出来的可执行文件还必须调用动态库才能正确运行。 当程序执行到相应位置时,就会去动态库中查找函数实现。 这种方式编译出来的可执行程序较小,并且可以随时升级动态库,无需重新编译生成可执行文件。

动态库的编译需要用到-fPIC和-shared这两个参数。 本来是像静态库一样通过-L和-l这两个参数来指定库文件路径和文件名,但是到了动态库,就不成功了。 ,直接指定。

# 动态库编译生成
gcc -o libtest.so -fPIC -shared funa.c
gcc -o testMain testMain.c ./libtest.so        # 直接指定动态库位置

测试程序仍然是上面静态库的程序,然后做一个实验,改变funa.c,重新生成动态库,而不是重新编译生成testMain可执行文件。

#include "funa.h"
void printa(){
    printf("print a; after modificationn");
}

执行观察:结果更改成功。 说明更新动态库的方便,无需重新编译生成可执行文件。

库文件依赖关系

生成的可执行文件可以通过检查库文件依赖关系来检查编译是否成功,命令ldd; 如果显示找不到库文件,则说明库文件链接失败。

参考资料:文章写得很清楚,但是排版太乱(他直接从转载的复制粘贴过来的)。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 aforge库源码编译-Linux下编译C++/C生成.a或.so库文件 https://www.wkzy.net/game/160760.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务