Enums 如何使用Cython调用JUCE?

Enums 如何使用Cython调用JUCE?,enums,compilation,cython,juce,Enums,Compilation,Cython,Juce,目前,我正试图从Cython获得JUCE音频框架。因此,我首先希望通过展示一个贯穿JUCE框架的示例来运行一个小而简单的示例,但目前我似乎遇到了两个小问题: 1.我在从JUCE框架调用枚举时遇到问题 2.我不知道如何包含整个编译和链接框架 My setup.py(使用“python3 setup.py build\u ext--inplace”调用): 我的testb.pyx(问题1在这里): 此外,我不断地得到这些类型的错误,据我所知,这些错误是由于框架的其余部分没有得到编译和包含/链接而导致

目前,我正试图从Cython获得JUCE音频框架。因此,我首先希望通过展示一个贯穿JUCE框架的示例来运行一个小而简单的示例,但目前我似乎遇到了两个小问题: 1.我在从JUCE框架调用枚举时遇到问题 2.我不知道如何包含整个编译和链接框架

My setup.py(使用“python3 setup.py build\u ext--inplace”调用):

我的testb.pyx(问题1在这里):

此外,我不断地得到这些类型的错误,据我所知,这些错误是由于框架的其余部分没有得到编译和包含/链接而导致的。我该怎么做

ImportError:
dlopen(<project root>/build/lib/testb.cpython-36m-darwin.so, 2): Symbol not found: __ZN4juce6StringC1Ev
Referenced from:
<project root>/build/lib/testb.cpython-36m-darwin.so
Expected in: flat namespace
in <project root>/build/lib/testb.cpython-36m-darwin.so
和我的Cython文件:

# testb.pyx
# distutils: language = c++

from libcpp.string cimport string

cdef extern from "JuceLibraryCode/JuceHeader.h":
    cdef cppclass AlertWindow:
        AlertWindow(String, String, AlertIconType, Component*)

    cdef cppclass Component:
        Component()

    cdef cppclass String:
        String(string)

cdef extern from "JuceLibraryCode/JuceHeader.h" namespace    "juce::AlertWindow":
    ctypedef enum AlertIconType:
        NoIcon
        QuestionIcon
        WarningIcon
        InfoIcon

cdef class PyAlertWindow:
    cdef AlertWindow *thisptr
    def __cinit__(self):
        self.thisptr = new AlertWindow(String(""), String(""), AlertIconType(NoIcon), NULL)
    def __dealloc__(self):
        del self.thisptr
这个例子现在编译得很好。但是,当我导入结果包时,会出现以下错误:

ImportError: dlopen(<project root>/testb.cpython-36m-darwin.so, 2): Symbol not found: _CGAffineTransformIdentity
  Referenced from: <project root>/testb.cpython-36m-darwin.so
  Expected in: flat namespace
 in <project root>/testb.cpython-36m-darwin.so
ImportError:dlopen(/testb.cpython-36m-darwin.so,2):未找到符号:\u CGAffineTransformity
引用自:/testb.cpython-36m-darwin.so
应为:平面命名空间
in/testb.cpython-36m-darwin.so
这似乎与Cocoa或CoreGraphics有关(我也相信它是Cocoa的继承者)。那么我该如何解决这个问题呢?我是否需要包括框架CoreGraphics?如果需要,如何包括?(简单地添加标志-frameworkcoregraphics会导致clang:error:unknown参数:'-frameworkcoregraphics'不幸)


提前感谢您的回答

到您的第一个问题:如果您的枚举和函数定义为

//YYY.h
namespace Foo{
  enum Bar {bar1, bar2};
  void do_it(Bar bar);
}
然后,您需要在cython中导入枚举值以及枚举类型名称,它应该如下所示:

cdef extern from 'XXX/YYY.h' namespace 'Foo':
    ctypedef enum Bar:
      bar1
      bar2
    cpdef void do_it(Bar a)
Extension('testb', ['src/JUCE/testb.pyx'], ...
          libraries=['juce', 'x11', 'freetype2', ...], #all needed libraries
          library_dirs=[PATH_TO_JUCE, '/usr/X11R6/lib', '/usr/lib', ...] #all needed library paths
         }
然后可以通过cython代码中的某个地方调用它。事实上,我从一段时间以前就知道了,所以你可以考虑投票表决。 第二个问题是,您需要链接juce库(现在您只使用includes),为此,您需要将以下内容添加到扩展设置中:

Extension('testb', ['src/JUCE/testb.pyx'], ...
          libraries=[juce],#here the right name on your system
          library_dirs=[PATH_TO_JUCE_LIB_ON_YOUR_SYSTEM]
         }
PS:如果您不喜欢inplace选项的结果,请咨询其他选项

编辑:JUCE还有一些需要提供给链接器的依赖项。我认为最好的方法是为您的系统构建一个c++示例(例如),并查看需要哪些库

通过查看,似乎至少需要以下库:
freetype2 libcurl x11 xext xinerama webkit2gtk-4.0 gtk+-x11-3.0
。也许你甚至需要先安装它们,我不认为它们在每个系统上都是默认的

然后,您的设置应该如下所示:

cdef extern from 'XXX/YYY.h' namespace 'Foo':
    ctypedef enum Bar:
      bar1
      bar2
    cpdef void do_it(Bar a)
Extension('testb', ['src/JUCE/testb.pyx'], ...
          libraries=['juce', 'x11', 'freetype2', ...], #all needed libraries
          library_dirs=[PATH_TO_JUCE, '/usr/X11R6/lib', '/usr/lib', ...] #all needed library paths
         }

非常感谢您的回答,它似乎已经解决了我的Enum问题。它似乎也为我的另一个问题提供了一个解决方案,但尽管我尽了最大的努力,我仍然有问题。你能告诉我更多的细节吗?我有一个JuceHeader.h(如OP中所示),它反过来会导入许多其他头文件,并且我有一个*.a文件中的JUCE库。那我怎么用这个是Cython?简单地填写库和库目录会导致相同的错误。奇怪的是编译进行得很顺利,在导入过程中我只得到了一个符号not found error。@meme您能提供您的确切设置和确切的错误消息吗?您确定缺少的符号是由库提供的吗?谢谢,我有很多(?)进一步的信息,但我正在运行一个相关的问题(扩展到下面)。你知道这是什么原因吗?
Extension('testb', ['src/JUCE/testb.pyx'], ...
          libraries=['juce', 'x11', 'freetype2', ...], #all needed libraries
          library_dirs=[PATH_TO_JUCE, '/usr/X11R6/lib', '/usr/lib', ...] #all needed library paths
         }