链接静态库与。 Linux 中的共享库

Linking static library Vs. shared library in Linux

我正在阅读一本关于 Raspberry Pi 的书来理解 Raspberry Pi。

书中的一个项目展示了一个 C++ class,它提供了访问 Raspberry Pi 上的 GPIO 的方法; class 名称是“gpio”。

书上讲了两种使用方法class:

  1. 写C++代码,simple.cpp:在simple.cpp中,main方法实例化gpioclass并调用它的public方法

  2. 要编写 Python 代码:必须使用 Boost.python 创建 gpio.so。然后写simple.py,其中导入了gpio,会调用它的public方法

第一种方法很简单:simple.cpp 和 gpio.cpp 链接在一起创建一个 exe。

做后者,书上推荐使用Boost.Python。

我下载了 Boost 包并调用 bootstrap.sh 和 b2 如下:

$ sudo ./bootstrap.sh --with-libraries=python --with-python-version=3.7
$ sudo ./b2 cxxflags=-fPIC -link=shared install

这些创建了 libboost_python37.so.1.73.0.

我尝试按如下方式构建 gpio.so:


PROG = gpio.so
CC = g++
CPPFLAGS = -c -fPIC -I/usr/include/python3.7m/ -I/usr/local/boost_1_73_0
LDFLAGS = -shared -pthread -L/usr/local/boost_1_73_0/bin.v2/libs/python/build/gcc- 
          8/release/python-3.7/threading-multi/visibility-hidden
LLIBS = -lboost_python37
OBJS = gpio.o

$(PROG) : $(OBJS)
  $(CC) $(LDFLAGS) -o $(PROG) $(OBJS) $(LLIBS)
gpio.o : gpio.h
  $(CC) $(CPPFLAGS) -c gpio.cpp

上面创建的 gpio.so 没有任何致命错误。

但是如果我这样做 'ldd gpio.so' 它的输出显示“libboost_python37.so.1.73.0 => 未找到”。

如果我 运行 simple.py,它的输出显示“ImportError: libboost_python37.so.1.73.0: cannot 打开共享对象文件:没有那个文件或目录。

当我使用静态 boost python 库时,我可以完成上面的第二种方法:从 python 代码调用 C++ 方法。

我的开发环境是Raspberry Pi 4 model B,4GB内存。 OS 是 Raspbian GNU/Linux 10(克星)。开发软件包括:

  1. 截至 2020 年 7 月 15 日的提升包:版本 1.73.0。
  2. Python 3.7.3(32 位)
  3. g++ (Raspbian 8.3.0-6+rpi1) 8.3.0

And I try to build gpio.so as follows:

您的命令行告诉 linker 如何在 link 时找到 libboost_python3.7.so。但它不会告诉运行时加载程序如何在运行时找到该库。

要告诉运行时加载程序,请使用 -rpath /path/to/library linker 标志。即:

BOOST_LIB_PATH = /usr/local/boost_1_73_0/bin.v2/libs/python/build/gcc-8/release/python-3.7/threading-multi/visibility-hidden

LDFLAGS = ... -L ${BOOST_LIB_PATH} -Wl,-rpath,${BOOST_LIB_PATH} ...

实际上 安装 libbost... 到系统目录而不是从构建树加载它可能更好。