Linux中so为共享动态链接库。下面我们通过一个四则运算的实例来学习动态链接库。

首先是头文件:my_math.h:

/**
 * my_math.h
 */

// a + b
int Add(int a, int b);

// a - b
int Minus(int a, int b);

// a * b
int Multiply(int a, int b);

// a / b
float Division(int a, int b);

然后是四则运算的实现:

/**
 * my_math.cpp
 */

#include "my_math.h"

// a + b
int Add(int a, int b) {
    return a + b;
}

// a - b
int Minus(int a, int b) {
    return a - b;
}

// a * b
int Multiply(int a, int b) {
    return a * b;
}

// a / b
float Division(int a, int b) {
    return (float)a / (float)b;
}

接着是四则运算的使用:

/**
 * test.cpp
 */

#include <iostream>
#include "my_math.h"

using namespace std;

int main() {
    int a = 10;
    int b = 3;
    cout << "add: " << Add(a, b) << endl;
    cout << "minus: " << Minus(a, b) << endl;
    cout << "multiply " << Multiply(a, b) << endl;
    cout << "division: " << Division(a, b) << endl;
}

请注意,这个使用四则运算的test.py中只使用了头文件,现在还运行不了,我们需要通过动态链接库来给test.py提供四则运算的实现,也就是说,我们需要把my_math.cpp编译成动态链接库

将当前文件夹加入动态链接库搜索路径

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

这个命令的意思是将当前目录加入动态链接库搜索路径,否则我们需要将生成的动态链接库加入/usr/lib

编译my_math.cpp

g++ -c my_math.cpp -o my_math.o

将my_math编译成动态库

g++ -shared my_math.o -o libmy_math.so

这里请注意动态链接库的命名格式为:lib<自命名>.so

编译 test.cpp

g++ test.cpp -o ./test -L. -lmy_math

-L<Path>参数指定链接库的路径,-l<自命名>指定具体动态链接库名称。

运行test

./test

可看到输出:

add: 13
minus: 7
multiply 30
division: 3.33333

大功告成。