0
votes

I am trying to link a cpp file with Scilab 5.5.2, using the following code

// This file is released under the 3-clause BSD license. See COPYING-BSD.
function builder_gw_cpp()   
    WITHOUT_AUTO_PUTLHSVAR = %t; 
    tbx_build_gateway("skeleton_cpp9990", ..    
    ["imread","opencv_imread"], ..
    ["opencv_imread.cpp"], .. 
    get_absolute_file_path("builder_gateway_cpp.sce"),[],"g++ -ggdb `pkg-config --cflags opencv` -o `basename opencv_imread.cpp .cpp` opencv_imread.cpp `pkg-config --libs opencv`");
endfunction

builder_gw_cpp(); 
clear    builder_gw_cpp;    // remove builder_gw_cpp on stack    

When I execute these commands:

 1)exec builder_gateway_cpp.sce
 2)exec loader.sce.

I get an error like this:

addinter(libskeleton_cpp6969_path + filesep() + 'libskeleton_cpp69690' + getdynlibext(), 'libskeleton_cpp69690', list_functions);
Link failed for dynamic library '/home/tess/work/functions/imcrop//libskeleton_cpp69690.so'.
An error occurred: /home/tess/work/functions/imcrop//libskeleton_cpp69690.so: undefined symbol: _ZN2cv3Mat10deallocateEv
Link failed for dynamic library '/home/tess/work/functions/imcrop//libskeleton_cpp69690.so'.
An error occurred: /home/tess/work/functions/imcrop//libskeleton_cpp69690.so: undefined symbol: _ZN2cv3Mat10deallocateEv
dynlibext(), 'libskeleton_cpp69690', list_functions)
                                                     !--error 236 
addinter: The shared archive was not loaded: (null)
at line      15 of exec file called by :    
exec loader.sce

The symbols are found in libopencv_imgproc.

  • How do I ensure the code finds the required libraries?
1
What is the output of ldd /home/tess/work/functions/imcrop//libskeleton_cpp69690.so? - spoorcc
linux-vdso.so.1 => (0x00007fff31dfc000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f15df9d9000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f15df614000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f15df3fd000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f15df0f7000) /lib64/ld-linux-x86-64.so.2 (0x00007f15dfeff000) - user3440725
There are no opencv libs linked, see my answer below for the probable cause. - spoorcc

1 Answers

0
votes

According to tbx_build_gateway docs you are providing:

tbx_build_gateway(libname, names, files, [gateway_path [, libs [, ldflags [, cflags [, fflags [, cc [, makename [, ismex]]]]]]]])

libname = "skeleton_cpp9990"
names = "imread", "opencv_imread"
files = opencv_imread.cpp
gateway_path = get_absolute_file_path("builder_gateway_cpp.sce")
libs = []
ldflags= "g++ -ggdb `pkg-config --cflags opencv` -o `basename opencv_imread.cpp .cpp` opencv_imread.cpp `pkg-config --libs opencv`"
cflags = 
fflags = 
cc = 
makename = 
ismex =

I'm not an expert in tbx_build_gateway but I could imagine that ldflags is not the appropriate field to provide your build command, I would expect something more like the following:

libname = "skeleton_cpp9990"
names = "imread", "opencv_imread"
files = opencv_imread.cpp
gateway_path = get_absolute_file_path("builder_gateway_cpp.sce")
libs = ["opencv","opencv_imgproc"]
ldflags= 
cflags = "-ggdb `pkg-config --cflags opencv` -o `basename opencv_imread.cpp .cpp` opencv_imread.cpp `pkg-config`"
fflags = 
cc = "g++"
makename = 
ismex =