21xrx.com
2024-11-05 19:25:09 Tuesday
登录
文章检索 我的文章 写文章
C++ 编译链接库教程
2023-07-07 04:42:26 深夜i     --     --
C++ 编译 链接库 教程 库文件

在 C++ 开发中,我们通常会编写一些通用的代码模块,比如一些常用的算法、数据结构、IO 操作等等。为方便代码复用和维护,我们通常会把这些代码封装成库,供其他程序使用。而编写库,就需要进行编译和链接操作。本教程将介绍如何使用 g++ 编译和链接 C++ 库。

我们将编写一个示例库,包括一个头文件 `example.h` 和一个源文件 `example.cpp`。其中,`example.h` 定义了一个自定义类型 `Example`,`example.cpp` 实现了 `Example` 的一些函数。


// example.h

#pragma once

class Example {

public:

 Example(int val);

 int value();

 void setValue(int val);

private:

 int m_value;

};


// example.cpp

#include "example.h"

Example::Example(int val) : m_value(val) {}

int Example::value()

 return m_value;

void Example::setValue(int val)

 m_value = val;

我们需要将 `example.cpp` 编译成对象文件,然后将对象文件打包成库,以便其他程序使用。

## 1. 编译对象文件

首先,我们需要将 `example.cpp` 编译成一个对象文件,使用参数 `-c` 可以让 g++ 只进行编译,而不进行链接。


g++ -c example.cpp -o example.o

上述命令将编译 `example.cpp`,生成目标文件 `example.o`。需要注意的是,`-o` 参数指定目标文件名,可以省略,默认的目标文件名为源文件名去掉后缀加上 `.o`。

## 2. 静态库

静态库是包含若干对象文件的归档文件,使用命令 `ar` 可以将若干对象文件打包成静态库,使用参数 `r` 向静态库中添加对象文件,使用参数 `s` 可以将静态库中的符号表保存到静态库中,以供链接时使用。


ar rcs libexample.a example.o

上述命令将将 `example.o` 添加到静态库 `libexample.a` 中,`r` 表示替换同名文件中的目标文件,`c` 表示创建新的库文件,`s` 表示在库文件中保存符号表。

## 3. 动态库

动态库与静态库不同,其可被多个程序共享。使用命令 `g++` 可以将若干对象文件链接成动态库。


g++ -shared -fPIC example.o -o libexample.so

上述命令将将 `example.o` 链接成动态库 `libexample.so`,`-shared` 表示生成动态库,`-fPIC` 表示使用位置无关代码,方便动态库被多个程序共享。

## 4. 使用库

编写好库之后,其他程序可以调用库中的函数,需要在编译和链接时指定库的名称和路径。静态库在链接时需要指定静态库名称和路径,动态库在链接时需要指定动态库名称和动态库路径,以及在运行时需要指定动态库路径。


# 静态库链接

g++ -o main main.cpp -I. -L. -l example

# 动态库链接

g++ -o main main.cpp -I. -L. -l example -Wl,-rpath,.

上述命令将 `main.cpp` 编译链接成可执行文件 `main`,`-I` 参数指定头文件路径,`-L` 参数指定库文件路径,`-l` 参数指定库名称,`-Wl,-rpath` 参数指定动态库路径。

## 总结

本教程介绍了如何使用 g++ 编译和链接 C++ 库,包括编译生成对象文件、打包生成静态库、链接生成动态库以及使用库。编写和使用库可以提高 C++ 开发效率和代码的可维护性,是 C++ 开发不可缺少的一环。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复