导入错误:将 pybind11 与静态/共享库链接时出现未定义符号

问题描述 投票:0回答:1

我尝试将 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)

然后一切正常。

如果有人能提供帮助,我将非常感激。

static-linking dynamic-linking pybind11
1个回答
0
投票

我在这里找到了答案:使用 pybind11 cmd 的未定义符号

这并不是一个真正的

pybind11
特定问题,而是一个 C/C++ 问题。

所有这些链接器标志都应该出现在需要它们的 cpp 之后。

就我而言,交换“libadd.a”和“my_add.cpp”可以解决问题。

我的问题可以标记为重复。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.