_ZSt28__throw_bad_array_new_lengthv пытается импортировать код C++ в Python после компиляции общего объекта ⇐ Python

Программы на Python
Anonymous
_ZSt28__throw_bad_array_new_lengthv пытается импортировать код C++ в Python после компиляции общего объекта

Сообщение Anonymous »

Столкнулся с неприятной проблемой при импорте библиотеки Python, которая сама вызывает некоторый код, который я написал на C++ и скомпилировал в .so.
Код C++ выглядит следующим образом: >

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 

std::vector bigram(std::string initial_str) {
int len = initial_str.size();
std::vector tokens;
for (int i = 0; i < len-1; i += 1){
tokens.push_back(initial_str.substr(i, 2));
}
return tokens;
}

std::vector vsunion(std::vector s1, std::vector s2) {
std::vector union_str(s1);
union_str.insert(union_str.end(), s2.begin(), s2.end());
std::sort(union_str.begin(), union_str.end());
union_str.erase(std::unique(union_str.begin(), union_str.end()), union_str.end());
return union_str;
}

std::vector ufreq(std::vector u, std::vector s) {
int len = u.size();
std::vector vfreq;
for (int i = 0; i < len; i += 1){
int freq = std::count(s.begin(), s.end(), u[i]);
vfreq.push_back(freq);
}
return vfreq;
}

float similarity(std::vector f1, std::vector f2) {
float num = std::inner_product(f1.begin(), f1.end(), f2.begin(), 0.0);
float den1 = std::inner_product(f1.begin(), f1.end(), f1.begin(), 0.0);
float den2 = std::inner_product(f2.begin(), f2.end(), f2.begin(), 0.0);
float similarity = num / std::sqrt(den1 * den2);
return similarity;
}

float similarity(std::string string1, std::string string2) {
std::vector new_str = bigram(string1);
std::vector new_str2 = bigram(string2);
std::vector union_str = vsunion(new_str, new_str2);
std::vector freq1 = ufreq(union_str, new_str);
std::vector freq2 = ufreq(union_str, new_str2);
float score = similarity(freq1, freq2);
return score;
}

extern "C" {
float gram(std::string str1, std::string str2)
{
return similarity(str1, str2);
}
}
Что я скомпилировал с помощью:

Код: Выделить всё

g++ gram.cpp -shared -o gram.so
и, наконец, я пытаюсь импортировать приведенный ниже скрипт, который выдает ошибку в заголовке «_ZSt28__throw_bad_array_new_lengthv не может быть найден в библиотеке динамической компоновки»:

Код: Выделить всё

import ctypes
import sys
import os

dir_path = os.path.dirname(os.path.realpath(__file__))
handle = ctypes.CDLL(dir_path + "/gram.so")

handle.My_Function.argtypes = [ctypes.c_wchar_p]

def gram(string1, string2):
return handle.gram(string1, string2)
Есть идеи, где я мог ошибиться? Я могу скомпилировать тестовый пример вместо бита «extern»:

Код: Выделить всё

int main() {
float score = similarity("John Smith", "Johnny John Smith");
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/71331756/zst28-throw-bad-array-new-lengthv-trying-to-import-c-code-in-python-after-co[/url]

Вернуться в «Python»