Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 赛顿:为什么;重复符号“;?_C++_Cython - Fatal编程技术网

C++ 赛顿:为什么;重复符号“;?

C++ 赛顿:为什么;重复符号“;?,c++,cython,C++,Cython,我是Cython的新手,所以如果这是一个noob问题,请原谅我。我试图把它修改成纯C++(.H..cp)实现,然后由.Pyx文件包。 素数。h: #include <list> std::list<int> primes2_c(int maxn); 素数。设置: #include "primes.h" #include <list> std::list<int> primes2_c(int maxn) { int n; st

我是Cython的新手,所以如果这是一个noob问题,请原谅我。我试图把它修改成纯C++(.H..cp)实现,然后由.Pyx文件包。 素数。h:

#include <list>

std::list<int> primes2_c(int maxn);
素数。设置

#include "primes.h"

#include <list>

std::list<int> primes2_c(int maxn) {
    int n;
    std::list<int> ret;
    n = 2;
    while (n < maxn) {
        auto it = ret.begin();
        for (; it != ret.end() && n % *it != 0; it++);
        if (it == ret.end()) {
            ret.push_back(n);
        }
        n++;
    }

    return ret;
}
cdef extern from "primes.h":
    list[int] primes2_c(int)

def primes2(kmax):
    ret = primes2_c(kmax)
    return ret
from distutils.core import setup, Extension
from Cython.Build import cythonize

setup(
    name='primes',
    ext_modules=cythonize(Extension(
        'primes',
        ['primes.pyx', 'primes.cpp'],
        language='c++',
        extra_compile_args=["-std=c++11"],
        extra_link_args=["-std=c++11"],
    ))
)
然后我运行编译并看到以下错误:

[cython (master)]$ python primes.setup build_ext --inplace
running build_ext
building 'primes' extension
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Users/.../venv/cython/include -I/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c primes.cpp -o build/temp.macosx-10.6-intel-3.5/primes.o -std=c++11
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Users/.../venv/cython/include -I/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c primes.cpp -o build/temp.macosx-10.6-intel-3.5/primes.o -std=c++11
/usr/bin/clang++ -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.5/primes.o build/temp.macosx-10.6-intel-3.5/primes.o -o /Users/.../cython/primes.cpython-35m-darwin.so -std=c++11
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9
duplicate symbol __Z9primes2_ci in:
    build/temp.macosx-10.6-intel-3.5/primes.o
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command '/usr/bin/clang++' failed with exit status 1
[cython (master)]$

我的理解是,primes.pyx只读取
primes2_c()
的API,而不读取实现。因此,为同一函数提供的唯一实现应该是从primes.cpp中的primes.cpp

中引用primes.cpp

您能否将
primes.cpp
重命名为例如
primesc.cpp
?我认为作为构建的一部分,
primes.pyx
由Cython编译为
primes.cpp
,因此存在文件名冲突。

我不熟悉
Cython.build
,但从构建日志中可以看到它正在从
primes.cpp
编译
primes.o
,两次,然后当它试图构建
。所以
它试图链接
primes.o
两次。你的观察是正确的。我也注意到了这一点。我的OP试图问“为什么primes.cpp中的实现链接了两次”。事实上,正如您所说,使用相同的主文件名命名
.cpp
.pyx
是一个问题。然而,这对我来说是出乎意料的,我想这是Cython方面的一个问题,因为它无论如何都会生成一个构建文件夹,我希望任何中间文件都会被放置到构建文件夹中。但无论如何,谢谢你的回答!我进一步发现
.pyx
文件应该与包名同名,因为将其重命名为类似
wrapper.pyx
的文件将导致导入错误:动态模块不定义模块导出函数(PyInit_prime)。这里的硬编码命名规则很容易让新手错过。