Я скомпилировал программу на C ++ в динамическую библиотеку, которую я сейчас вызываю в python через ctypes.Однако я получаю следующую ошибку:
*** glibc detected *** ../../bin/python: free(): invalid pointer: 0x00007fbdf8ae3500 ***
Как мне выяснить, является ли это ошибкой в коде C ++ или в том, как я использую ctypes?
Библиотека C ++запускает успешно , когда она связана с программой на Си или если я скомпилирую ее как отдельную программу.В сочетании с ctypes он всегда вылетает в этой строке C ++:
// ... A bunch of code
if(tempBuffer) {
delete[] tempBuffer;
// More code below that never runs...
Код Python, который не работает:
def test(fileName):
feedbackLib = cdll.LoadLibrary("./libpitch.so")
# Set return type to a character pointer
feedbackLib.getPitchString.restype = c_char_p
feedbackLib.getPitchString.argtypes = [c_char_p]
# Crashes Here!
feedbackStr = feedbackLib.getPitchString(fileName)
return feedbackStr
По какой-то причине я могу заставить программу Python работать успешно, если яизмените все вокруг так:
def test(fileName):
# I've only changed this line
feedbackLib = CDLL("./libpitch.so")
# Set return type to a character pointer
feedbackLib.getPitchString.restype = c_char_p
feedbackLib.getPitchString.argtypes = [c_char_p]
# No longer crashes!
feedbackStr = feedbackLib.getPitchString(fileName)
return feedbackStr
Однако, если я начну добавлять вещи в вышеуказанную функцию (что мне нужно сделать), это даст мне другие ошибки glibc.
Вот информация о том, как я скомпилировал C ++ на случай, если это уместно.
Заголовок функции, которую я вызываю, используя extern "C", похоже, как заставить код C ++ работать с CTypes:
extern "C" char* getPitchString(char* filename);
g ++ команды:
$(CXX) $(LDFLAGS) -fPIC -c $(SRCS) $(LIBS)
$(CXX) -shared -Wl,-soname,libpitch.so -o libpitch.so $(OBJS) $(LIBS)