Linux制作C++静态库和动态库并使用示例

时间:2024-04-06 08:30:27

创建动态库:

编写源文件:
// sub.h 显式调用
#include <iostream>

extern "C" int sub(int a, int b);

// sub.cpp
#include "sub.h"

int sub(int a, int b)
{
    return a - b;
}

// quadrature.h 隐式调用
#include <iostream>

int quadrature(const int& a, const int& b);

// quadrature.cpp
#include "quadrature.h"

int quadrature(const int& a, const int& b)
{
    return a - b;
}
编译源文件为位置无关的目标文件:

对于C++:

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

-fPIC 参数用于生成位置无关的代码,这是创建动态库所必需的。

创建动态库:

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

这会将目标文件 example.o 创建成一个名为 libexample.so 的动态库。

使用动态库:

隐式调用

// main.cpp

#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>

#include "quadrature.h"

int main()
{

    std::cout << quadrature(1, 2) << std::endl;

    return 0;
}
编译源文件并链接动态库:

对于C++:

g++ main.cpp -o main -L./ -lquadrature

其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.so后缀)。

配置

第一种:隐式调用动态库需要把动态库拷贝到系统默认的库路径中,所以可以手动拷贝
第二种:

设置 LD_LIBRARY_PATH:** 如果库文件不在系统标准的库路径下,你可以使用 LD_LIBRARY_PATH 环境变量将其所在目录添加
到库搜索路径中。例如:

export LD_LIBRARY_PATH=/usr/vscode/动态库和静态库/隐式调用动态库/libquadrature.so:$LD_LIBRARY_PATH

但是这样有一个弊端,就是重新打开一个终端,就得再配置一遍环境变量

运行程序:

./main

这样就完成了在Linux下创建和使用动态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的动态库。需要注意的是,在运行时,系统需要能够找到动态库,可以通过将动态库路径加入到LD_LIBRARY_PATH环境变量中,或者将动态库拷贝到系统默认的库路径中。

显式调用

在这里插入图片描述

// main.cpp

#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>

#include "sub.h"

typedef int (*dfunc)(int, int);

int main()
{
    void* dlib = dlopen("./libsub.so", RTLD_LAZY);
    if (!dlib)
    {
        std::cout << "动态库打开失败" << std::endl;

        return -1;
    }

    dfunc sub = (dfunc)dlsym(dlib, "sub");
    if (!sub)
    {
        std::cout << "动态库加载失败" << std::endl;

        dlclose(dlib);
        return -1;
    }

    std::cout << sub(1, 2) << std::endl;
    dlclose(dlib);

    return 0;
}
编译源文件并链接动态库:

对于C++:

g++ main.cpp -o main -ldl

显式调用动态库不需要链接动态库路径和名称,但是因为调用了dlopen、dlsym、dlclose函数,需要链接libdl.so库

配置

不需要配置

运行程序:
./main

在Linux系统下创建静态库(Static Library)并使用,你可以按照以下步骤进行:

创建静态库:

编写源文件: 创建你的C/C++源文件(例如,example.c或example.cpp),并编写相应的代码。
/

/ sum.h
#include <iostream>

int sum(const int& a, const int& b);

// sum.cpp
#include "sum.h"

int sum(const int& a, const int& b)
{
    return a + b;
}
编译源文件: 使用编译器将源文件编译成目标文件(.o文件):

对于C++:

g++ -c sum.cpp -o sum.o
打包目标文件为静态库:
ar rcs libexample.a sum.o

这会将目标文件 example.o 打包成一个名为 libexample.a 的静态库。

使用静态库:

在这里插入图片描述

编写使用静态库的源文件: 创建另一个源文件,并编写使用静态库的代码。
// main.cpp
#include <iostream>

#include "sum.h"

int main()
{

    std::cout << sum(1, 2) << std::endl;

    return 0;
}
编译源文件并链接静态库:

对于C++:

g++ main.cpp -o main -L./ -lsum

其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.a后缀)。

运行程序:
./main

这样就完成了在Linux下创建和使用静态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的静态库。