我正在构建一些利用pybind11进行包装并创建Python扩展模块的C ++代码,我遇到了一些未定义的符号问题。经过进一步检查,似乎是因为某些模板函数特化在我正在构建的共享库中不会公开显示。
我有一个MWE来明确证明问题:
symbol_test.hpp
#include <pybind11/pybind11.h>
template <typename T>
void test_func(T var) {}
template <>
void test_func<int>(int);
template <>
void test_func<pybind11::object>(pybind11::object);
symbol_test.cpp
#include "symbol_test.hpp"
template <>
void test_func<int>(int var) {}
template <>
void test_func<pybind11::object>(pybind11::object var) {}
构建命令:
g++ -std=c++14 -fPIC -I/home/farmer/anaconda3/envs/default/include/python2.7 -I/home/farmer/repos/pybind11/include -shared -o testlib.so symbol_test.cpp
使用nm检查库:
nm testlib.so
...
00000000000024d0 T _Z9test_funcIiEvT_
00000000000024da t _Z9test_funcIN8pybind116objectEEvT_
...
简而言之,专门用于“int”的test_func实例是可见的,但是专门用于“pybind11 :: object”的实例不是。为什么?我该如何控制?我需要在库中导出函数的pybind11 :: object版本,但我不知道它为什么不是。
我在这里提出问题而不是将其作为pybind11错误提交,因为我只是假设有些东西我不明白模板函数符号是如何在共享库中导出的,而不是pybind11中的缺陷。
编辑:我有一个想法; pybind11是一个只有头的库,所以我想pybind11 :: object类的代码没有构建或者什么?这会影响使用它的模板函数的可见性吗?