Почему при попытке запустить программу Cython на моем Mac появляется ошибка «Обнаружен символ»? - PullRequest
0 голосов
/ 10 июня 2019

Я получаю следующую ошибку, и я был бы признателен за помощь в отслеживании, почему это происходит:

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 ++ работает отлично?

...