在 C++ 中隐式的使用.so 动态库

在 archlinux 上成功实现了隐式调用动态库.

虽然遇到了一些小问题, 但是在网络搜索引擎的帮助下, 成功解决.

主要代码

myadd.cpp 和 myadd.h

1
2
// myadd.h
int add(int a, int b);
1
2
3
4
5
6
7
// myadd.cpp
#include "myadd.h"
#define N 0

int add(int x, int y) {
return x + y + N;
}

使用 g++ -fPIC -shared myadd.cpp -o libmyadd.so 来编译 myadd.cpp 成动态库libmyadd.so

main.cpp

1
2
3
4
5
6
7
8
9
10
// main.cpp
#include <iostream>
#include "myadd.h"

int main()
{
int sum = add(1, 2);
std::cout << "add(1, 2) = " << sum << std::endl;
return 0;
}

使用 g++ main.cpp -L. -lmyadd && ./a.out 获得如下输出

-L. -lmyadd参数的意思是在 ./ 目录去寻找libmyadd.so

1
./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory

动态库的隐式调用失败.

寻找问题发生的原因

为什么 g++ main.cpp -L. -lmyadd 这条命令成功的在 ./ 当前目录找到了动态库并且编译连接, 但是运行时, 却找不到动态库呢?

这是由于在编译链接期间, 其找寻 .so 是根据 -L 和默认的 /usr/lib, /libLIBRARY_PATH

而在运行期间, 寻找 .so 是根据 /usr/lib,/libLD_LIBRARY_PATH

解决问题

1
2
3
4
#  先临时的把当前目录 /path/to/test/ 添加到 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/test/
# 然后运行程序
./a.out

成功获得输出

1
add(1, 2) = 3

成功完成动态库的隐式调用.

目录结构

1
2
3
4
5
6
test/
├── a.out
├── main.cpp
├── myadd.cpp
├── myadd.h
└── libmyadd.so

待解决的问题

那么怎样完美的解决动态库路径这个问题呢?

见我的这篇文章 在 Linux 中完美的使用 .so 动态库