链接静态库与。 Linux 中的共享库
Linking static library Vs. shared library in Linux
我正在阅读一本关于 Raspberry Pi 的书来理解 Raspberry Pi。
书中的一个项目展示了一个 C++ class,它提供了访问 Raspberry Pi 上的 GPIO 的方法; class 名称是“gpio”。
书上讲了两种使用方法class:
写C++代码,simple.cpp:在simple.cpp中,main方法实例化gpioclass并调用它的public方法
要编写 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(克星)。开发软件包括:
- 截至 2020 年 7 月 15 日的提升包:版本 1.73.0。
- Python 3.7.3(32 位)
- 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...
到系统目录而不是从构建树加载它可能更好。
我正在阅读一本关于 Raspberry Pi 的书来理解 Raspberry Pi。
书中的一个项目展示了一个 C++ class,它提供了访问 Raspberry Pi 上的 GPIO 的方法; class 名称是“gpio”。
书上讲了两种使用方法class:
写C++代码,simple.cpp:在simple.cpp中,main方法实例化gpioclass并调用它的public方法
要编写 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(克星)。开发软件包括:
- 截至 2020 年 7 月 15 日的提升包:版本 1.73.0。
- Python 3.7.3(32 位)
- 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...
到系统目录而不是从构建树加载它可能更好。