Видимость специализаций шаблонных функций в разделяемых библиотеках;зависимость от параметра шаблона - PullRequest
0 голосов
/ 04 июня 2018

Я создаю некоторый код C ++, который использует pybind11 , чтобы выполнить обтекание и создать модуль расширения Python, и я столкнулся с некоторыми неопределенными проблемами с символами.При дальнейшем рассмотрении выясняется, что некоторые специализации шаблонных функций не видны публично в общей библиотеке, которую я создаю.

У меня есть 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 testlib.so
...
00000000000024d0 T _Z9test_funcIiEvT_
00000000000024da t _Z9test_funcIN8pybind116objectEEvT_
...

Короче,экземпляр test_func, специализирующийся на «int», виден, а экземпляр, специализированный на «pybind11 :: object», - нет.Зачем?Как мне это контролировать?Мне нужно экспортировать версию библиотеки pybind11 :: object в библиотеку, но я не знаю, почему это не так.

Я задаю вопрос здесь, а не представляю его как ошибку pybind11, потому чтоЯ просто предполагаю, что есть кое-что, чего я не понимаю в том, как символы шаблонных функций экспортируются в разделяемые библиотеки, а не в pybind11.

Редактировать: у меня была мысль;pybind11 - это библиотека только для заголовков, поэтому я предполагаю, что код для класса pybind11 :: object не создается или что-то в этом роде?И это влияет на видимость функций шаблона, которые его используют?

...