Я получаю следующую ошибку, и я был бы признателен за помощь в отслеживании, почему это происходит:
Traceback (последний вызов был последним): файл "wterms_1p.py", строка 16,вход из w2_integration.integrate_cf import v Ошибка ImportEr: dlopen (/Users/ian/Dropbox/Frohlich/linkedcluster/w2_integration/integrate_cf.so, 2): символ не найден: __ZN9Integrate1hEddPSt7complexIdE Пользователь / ссылка / исключена / удалена из-за ссылки:w2_integration / integrate_cf.so Ожидается в: плоском пространстве имен в /Users/ian/Dropbox/Frohlich/linkedcluster/w2_integration/integrate_cf.so
Для некоторого фона мой проект кода включает в себя библиотеки C ++ и основную.файл cpp, который я использую для проверки правильности работы библиотек.Они скомпилированы через этот Makefile:
CC=mpic++ -Wl,-rpath,/Users/ian/anaconda2/lib/
all: libdblquad.so libintegrate.so w2
libdblquad.so: dblquad.cpp dblquad.h
$(CC) -O3 -std=c++14 -fPIC dblquad.cpp -lgsl -lgslcblas -shared -o libdblquad.so -Wl,-rpath,.
libintegrate.so: coefficients.cpp integrate.cpp integrate.h arithmetic.h coefficients.h Complex.h
$(CC) -O3 -std=c++14 -fPIC coefficients.cpp integrate.cpp -L. -ldblquad -lfaddeeva -lgsl -shared -o libintegrate.so -Wl,-rpath,.
w2: main.cpp libintegrate.so libdblquad.so
$(CC) -O3 -std=c++14 main.cpp -L. -lintegrate -lgsl -lgslcblas -Wl,-rpath,/Users/ian/Dropbox/Frohlich/linkedcluster/w2_integration/
Когда я запускаю ./a.out (полученный исполняемый файл), все работает нормально.Однако, когда я затем вызываю функцию v, определенную в следующей программе Cython:
# cython: boundscheck=False, wraparound=False, nonecheck=False, cdivision=True, profile=True, linetrace=True
# distutils: language = c++
"""nmats.py"""
from libcpp.vector cimport vector
import numpy as np
cimport numpy as cnp
def v(k, t, n0):
tt = t.ravel()
return np.asarray(cf(k, tt, n0))
cdef extern from "integrate.h":
void integrate_cf(double k, double* t, complex* integrated_cf, int size, double n0)
cdef complex[:] cf(double k, double[:] t, double n0):
cdef complex[:] integrated_cf = np.ascontiguousarray(np.zeros_like(t, dtype=np.complex))
integrate_cf(k, &t[0], &integrated_cf[0], t.size, n0)
return integrated_cf
, которая компилируется с помощью setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
import os
os.environ["CC"] = "mpic++"
os.environ["CXX"] = "mpic++"
extensions = [
Extension("integrate_cf", ["integrate_cf.pyx"], extra_compile_args=["-O3", "-std=c++14"], extra_link_args=["-L"+os.getcwd(), "-L/usr/local/lib", "-Wl,-rpath,"+os.getcwd(), "-lintegrate", "-lgsl", "-lgslcblas"])]
ext_modules = cythonize(extensions)
setup(name="intcf", language='c++', ext_modules=ext_modules, include_dirs=[numpy.get_include()])
, я получаю ошибку Symbol not foundпоказано в верхней части этого поста.Для получения дополнительной информации main.cpp (который приводит к работающему исполняемому файлу) вызывает integrate_cf:
void integrate_cf(double k, double* s, Complex* val, int size, double n0)
{
Integrate integrate(n0);
MPI_Init(0, 0);
for( int i = 0; i < size; i++ )
{
//cout << s[i] << endl;
int status = integrate.h(k, s[i], &(val[i]));
if( status < 0 )
break;
}
}
Аналогично, вышеприведенная программа Cython, как показано, также вызывает integrate_cf.Вывод «c ++ фильтр -n _ZN9Integrate1hEddPSt7complexIdE»:
Integrate::h(double, double, std::complex<double>*)
Эта функция объявлена в integrate.h и определена в integrate.cpp.Есть идеи, почему моя программа на Cython не работает, а исполняемый файл на C ++ работает отлично?