linux 下编译生成静态库和动态库

18 篇文章 0 订阅

原文链接:添加链接描述

我们此处为了说明静态库和动态库的编译,会使用示例代码。创建 test.h, hello.cpp 和 world.cpp, 在两个源文件中分别实现两个函数( 此处都是示例代码,文件命名不规范,理解意思即可 )。

test.h (静态库头文件)

#ifndef TEST
#define TEST
void hello();
void world();
#endif

hello.cpp:

#include
#include “test.h”
using namespace std;
void hello()
{
cout << “this is hello” << endl;
}

world.cpp:

#include
#include “test.h”
using namespace std;
void world()
{
cout << “this is world” << endl;
}

静态库编译:
linux 下静态库的命名规则为 lib+库名+.a
1、首先将源文件夹编译成目标文件 ( hello.o, world.o )

g++ -c hello.cpp world.cpp
     注意 -c 参数是必须带,生成目标代码(机器代码),如果不带该参数,则是编译链接,由于没有main   函数,编译时会报错。编译完成之后生成 hello.o 和 world.o

2、用ar 工具将目标文件打包成 .a 静态库  ( libtest.lib )   

ar -crv libtest.lib hello.o world.o

动态库编译:
linux 下动态库的命名规则为 lib+库名+.so
1、生成目标文件(hello.o world.o),此时需要加编译器 选项 -fpic

g++ -fpic -c hello.cpp world.cpp
2、生成动态库, 

g++ -share -o libtest.so hello.o world.o

也可以将上面两步合并为一步

g++ -fpic -share -o libtest.so hello.pp world.cpp

如果生成的动态库不在 /lib 或者 /usr/lib 目录下,则需要将动态库的路径添加到 /etc/ld.so.cache 文件中,只有这样程序在运行时才能找到动态库, 添加步骤如下:

1、编辑 /etc/ld.so.conf 文件,将动态库路径加入该文件

2、调用 ldconfig 命令,重建 /etc/ld.so.cache 文件。

更为专业的生成动态库方式如下:
g++ -shared -Wl, -soname, libtest.so.1 -o libtest.so.1.10 hello.o world.o
编译完成之后生成 libtest.so.1.10 库文件,这是库的 realname

此时还需要将库路径添加入 /etc/ld.so.conf 中,然后 ldconfig -v 命令更新配置文件

更新完之后,生成了 libtest.so.1 文件,是库的 soname   (运行时的时候用 soname,只记录主版本号,检查主版本是否正确) 

调用如下命令,生成 linkname (linkname 在编译链接阶段使用,方便 makefile)

    ln -s libtest.so libtest.so.1.10

动态库和静态库的调用
动态库和静态库的调用方式相同, 以 main.cpp 中调用库函数说明:

g++ -o main.exe main.cpp -L . -ltest
其中 -L 选项指明库函数的位置

-ltest 为库名的缩写,只有完全按照linux 库命名规则命名的库才能采用缩写。全名为 libtest.a 或 libtest.so
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows和Linux生成静态库动态库的过程有些不同,下面分别介绍: **在Windows上生成静态库:** 1. 使用Visual Studio打开C/C++项目,右键点击项目名称,选择“属性”。 2. 选择“配置属性” -> “常规”,将“配置类型”设置为“静态库(.lib)”。 3. 在“配置属性” -> “C/C++” -> “常规”中,将“附加包含目录”设置为头文件所在目录。 4. 在“配置属性” -> “Librarian” -> “常规”中,将“附加库目录”设置为库文件输出目录。 5. 在“配置属性” -> “Librarian” -> “输入”中,添加需要生成静态库的源文件。 6. 点击“生成解决方案”,生成静态库文件。 **在Windows上生成动态库:** 1. 使用Visual Studio打开C/C++项目,右键点击项目名称,选择“属性”。 2. 选择“配置属性” -> “常规”,将“配置类型”设置为“动态库(.dll)”。 3. 在“配置属性” -> “C/C++” -> “常规”中,将“附加包含目录”设置为头文件所在目录。 4. 在“配置属性” -> “C/C++” -> “代码生成”中,将“运行库”设置为“多线程调试(/MTd)”或“多线程(/MT)”。 5. 在“配置属性” -> “Librarian” -> “常规”中,将“附加库目录”设置为库文件输出目录。 6. 在“配置属性” -> “Librarian” -> “输入”中,添加需要生成动态库的源文件。 7. 点击“生成解决方案”,生成动态库文件。 **在Linux生成静态库:** 1. 在命令行中进入源代码所在目录,执行以下命令生成目标文件: ``` gcc -c source.c -o object.o ``` 2. 使用ar命令生成静态库文件: ``` ar rcs libmylib.a object.o ``` 其中,-r参数表示将目标文件插入到库中,-c参数表示创建新的库文件,-s参数表示在库中添加符号表。 3. 生成静态库文件名为libmylib.a。 **在Linux生成动态库:** 1. 在命令行中进入源代码所在目录,执行以下命令生成共享目标文件: ``` gcc -c -fPIC source.c -o object.o ``` 其中,-c参数表示只编译不链接,-fPIC参数表示生成位置无关代码。 2. 使用gcc命令生成共享库文件: ``` gcc -shared -fPIC -o libmylib.so object.o ``` 其中,-shared参数表示生成共享库,-fPIC参数表示生成位置无关代码,-o参数指定生成的共享库文件名。 3. 生成动态库文件名为libmylib.so。 需要注意的是,生成静态库动态库的过程中需要指定库文件输出目录和头文件所在目录,以便后续使用时能够正确链接库文件和头文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值