我尝试将 pybind11 与静态库链接。构建过程成功,但我收到运行时错误“ImportError:未定义的符号”。直接与
.o
文件链接效果很好。
我对共享库也没有运气,有同样的错误。对于共享库,我将
libadd.so
移至 /usr/lib
。
使用静态库的示例如下:
/* my_add.cpp */
#include <pybind11/pybind11.h>
#include "add.hpp"
namespace py = pybind11;
PYBIND11_MODULE(my_add, m) {
m.def("add", &add);
}
/* add.hpp */
int add(int x, int y);
/* add.cpp */
#include "add.hpp"
int add(int x, int y) {
return x + y;
}
首先,我将
add.cpp
编译成静态库。
g++ -c add.cpp -o add.o
ar rcs libadd.a add.o
然后,我遵守了
my_add.cpp
并将其与libadd.a
联系起来。
g++ -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) libadd.a my_add.cpp -o my_add$(python3-config --extension-suffix)
在同一目录中:
$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_add
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /working_directory/my_add.cpython-310-x86_64-linux-gnu.so: undefined symbol: _Z3addii
另一方面,如果我用
构建g++ -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) add.o my_add.cpp -o my_add$(python3-config --extension-suffix)
然后一切正常。
如果有人能提供帮助,我将非常感激。
我在这里找到了答案:使用 pybind11 cmd 的未定义符号
这并不是一个真正的
pybind11
特定问题,而是一个 C/C++ 问题。
所有这些链接器标志都应该出现在需要它们的 cpp 之后。
就我而言,交换“libadd.a”和“my_add.cpp”可以解决问题。
我的问题可以标记为重复。谢谢。