Hello all, I'm completely new to Nim, but after having ridden a lot of 
tutorials, I completely fall in love with him.

For really being able to use it, I need a couple of libraries. Hopefully, all 
of them are available from C++ or already partially implemented.

I'm trying to use a large state-of-art library for Music Information Processing 
([Essentia](https://github.com/MTG/essentia/)). For now, I want to just load it 
dynamically, then I will try to understand how to create a good API.

I'm trying to use nimline for loading it dynamically. Below is my code, that 
should compute the spectrum of a random array. [Here 
is](https://github.com/MTG/essentia/blob/master/src/examples/standard_mfcc.cpp) 
an example from C++ to understand how the library works. 
[Here](https://essentia.upf.edu/doxygen/namespaceessentia_1_1standard.html), 
instead, the official documentation.
    
    
    import nimline
    import random
    
    cppincludes("./essentia/src/")
    cpplibpaths("./essentia/build/src/libessentia.so")
    
    defineCppType(OutputBase, "essentia::standard::OutputBase", 
"essentia/algorithmfactory.h")
    defineCppType(InputBase, "essentia::standard::InputBase", 
"essentia/algorithmfactory.h")
    defineCppType(Algorithm, "essentia::standard::Algorithm", 
"essentia/algorithmfactory.h")
    defineCppType(AlgorithmFactory, "essentia::standard::AlgorithmFactory", 
"essentia/algorithmfactory.h")
    
    proc main() =
        var FactoryType: AlgorithmFactory
        let factory: CppRef[AlgorithmFactory] = 
FactoryType.instance().to(CppRef[AlgorithmFactory])
        let spectrometer = factory.create("Spectrum").to(CppRef[Algorithm])
        
        var spectrum: seq[float32]
        var randArray: array[0..100, float32]
        for i in 0..<randArray.len:
            randArray[i] = rand(0.0..100.0)
        
        
spectrometer.output("spectrum").to(CppRef[InputBase]).set(spectrum).to(void)
        
spectrometer.input("spectrum").to(CppRef[InputBase]).set(randArray).to(void)
        spectrometer.compute().to(void)
        
        echo spectrum
    
    main()
    
    
    
    
    Run

I get the following error at C++/C compile time:
    
    
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp: In function 
‘void main__B027HVeEntcgpQ9b3jKwZeQ()’:
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:230:40: error: 
‘essentia::EssentiaFactory<BaseAlgorithm>::EssentiaFactory() [with 
BaseAlgorithm = essentia::standard::Algorithm]’ is protected within this context
      230 |   essentia::standard::AlgorithmFactory FactoryType;
          |                                        ^~~~~~~~~~~
    In file included from 
/home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:12:
    ./essentia/src/essentia/algorithmfactory.h:149:3: note: declared protected 
here
      149 |   EssentiaFactory() {}
          |   ^~~~~~~~~~~~~~~
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:235:78: error: 
no matching function for call to 
‘tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA::tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA(essentia::EssentiaFactory<essentia::standard::Algorithm>&)’
      235 | y = 
(tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA)(FactoryType.instance());
          |                                                                     
 ^
    
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note: 
candidate: 
‘tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA::tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA()’
       50 | struct tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA {
          |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note:   
candidate expects 0 arguments, 1 provided
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA::tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA(const
 tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note:   
no known conversion for argument 1 from 
‘essentia::EssentiaFactory<essentia::standard::Algorithm>’ to ‘const 
tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA::tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA(tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA&&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:50:8: note:   
no known conversion for argument 1 from 
‘essentia::EssentiaFactory<essentia::standard::Algorithm>’ to 
‘tyObject_CppRef__uzjF6kB2mFZZbGG9cViAamA&&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:237:95: error: 
no matching function for call to 
‘tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA::tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA(essentia::standard::Algorithm*)’
      237 | 
t_CppRef__3L9aJJuGBh50W6K9cBuua6HA)((*factory.p).create(("Spectrum")));
          |                                                                     
 ^
    
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note: 
candidate: 
‘tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA::tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA()’
       53 | struct tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA {
          |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note:   
candidate expects 0 arguments, 1 provided
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA::tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA(const
 tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note:   
no known conversion for argument 1 from ‘essentia::standard::Algorithm*’ to 
‘const tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA::tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA(tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA&&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:53:8: note:   
no known conversion for argument 1 from ‘essentia::standard::Algorithm*’ to 
‘tyObject_CppRef__3L9aJJuGBh50W6K9cBuua6HA&&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:263:128: error: 
no matching function for call to 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(essentia::standard::OutputBase&)’
      263 | 
Ref__SdQetZheNEfwTjB9cyvL0KQ)((*spectrometer.p).output(("spectrum"))));
          |                                                                     
^
    
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ()’
       56 | struct tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ {
          |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
candidate expects 0 arguments, 1 provided
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(const
 tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
no known conversion for argument 1 from ‘essentia::standard::OutputBase’ to 
‘const tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
no known conversion for argument 1 from ‘essentia::standard::OutputBase’ to 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:269:129: error: 
no matching function for call to 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(essentia::standard::InputBase&)’
      269 | 
pRef__SdQetZheNEfwTjB9cyvL0KQ)((*spectrometer.p).input(("spectrum"))));
          |                                                                     
^
    
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ()’
       56 | struct tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ {
          |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
candidate expects 0 arguments, 1 provided
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(const
 tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
no known conversion for argument 1 from ‘essentia::standard::InputBase’ to 
‘const tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note: 
candidate: ‘constexpr 
tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ::tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ(tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&&)’
    /home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp:56:8: note:   
no known conversion for argument 1 from ‘essentia::standard::InputBase’ to 
‘tyObject_CppRef__SdQetZheNEfwTjB9cyvL0KQ&&’
    Error: execution of an external compiler program 'gcc -c  -w -march=x86-64 
-mtune=generic -O2 -pipe -fno-plt -D_FORTIFY_SOURCE=2 -I./essentia/src/   
-I/usr/lib/nim -I/home/sapo/Develop/nim -o 
/home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp.o 
/home/sapo/.cache/nim/nimline_test_d/@mnimline_test.nim.cpp' failed with exit 
code: 1
    
    
    Run

Reply via email to