Error in linker c++ linux Scons : CLAM project

234 Views Asked by At

I'm trying to build and link examples from CLAM project. I link and get the following error. I don't know what's wrong.

>== Linking UserTutorial1
>/usr/local/lib/libclam_core.so: undefined reference to `dlclose'
>/usr/local/lib/libclam_core.so: undefined reference to `dlsym'
>/usr/local/lib/libclam_core.so: undefined reference to `dlopen'
>/usr/local/lib/libclam_core.so: undefined reference to `dlerror'
>/usr/local/lib/libclam_core.so: undefined reference to `dladdr'
>collect2: error: ld returned 1 exit status
>scons: *** [UserTutorial1] Error 1
>scons: building terminated because of errors.

Could anybody help me about that. What changes should I make to SConstruct shown below:

>## #!/usr/bin/python
>import os
>import glob
>import sys
>options = Variables('options.cache', ARGUMENTS)
>options.Add(PathVariable('clam_prefix', 'The prefix where CLAM was installed', ''))
>options.Add(BoolVariable('verbose', 'Display the full command line instead a short command >description', 'no') )
>options.Add(BoolVariable('crossmingw', 'Enables MinGW crosscompilation from linux', 'no') )
>def scanFiles(pattern, paths) :
>   files = []
>   for path in paths :
>       files+=glob.glob(path+"/"+pattern)
>   return files
>def recursiveDirs(root) :
>   return filter( (lambda a : a.rfind( ".svn")==-1 ),  [ a[0] for a in os.walk(root)]  )
>def unique(list) :
>   return dict.fromkeys(list).keys()
>toolchain = 'default'
>if sys.platform == "win32" : toolchain = 'mingw'
>env = Environment(tools=[toolchain], options=options)
>options.Save('options.cache', env)
>#TODO: This didn't work for dynamic linking
>def renameEmbededFileSymbols(source, target, env) :
>   """ Remove the path part of the symbol name for the embeded file"""
>   objdumpOutput=os.popen("objdump -x %s | grep _binary'.*'start"%target[0] , "r").read()
>   startSymbol=objdumpOutput.split()[-1]
>   infix = startSymbol[len('_binary_'):-len("_start")]
>   baseName = os.path.split(str(source[0]))[-1]
>   newInfix = infix[-len(baseName):]
>   return Execute("objcopy %(target)s "
>       "--redefine-sym _binary_%(infix)s_start=_binary_%(newInfix)s_start "
>       "--redefine-sym _binary_%(infix)s_end=_binary_%(newInfix)s_end "
>       "--redefine-sym _binary_%(infix)s_size=_binary_%(newInfix)s_size " % {
>           "infix": infix,
>           "newInfix": newInfix,
>           "target": target[0],
>       }
>   )
>"""
>embededFileBuilder = Builder(
>   action=Action([
>       ["ld", "-fPIC", "--shared", "-b", "binary", "-o", "$TARGET", "$SOURCE"],
>       renameEmbededFileSymbols,
>       ],
>       ),
>   suffix='.os',
>   )
>env['BUILDERS']['EmbededFile']=embededFileBuilder
>"""
>env.SConsignFile() # Single signature file
>crosscompiling=env['crossmingw']
>CLAMInstallDir = env['clam_prefix']
>clam_sconstoolspath = os.path.join(CLAMInstallDir,'share','clam','sconstools')
>env.Tool('clam', toolpath=[clam_sconstoolspath])
>env.Tool('qt4', toolpath=[clam_sconstoolspath])
>if crosscompiling :
>   env.Tool('crossmingw', toolpath=[clam_sconstoolspath])
>env.AppendUnique(ASFLAGS='-I. ')
>env['CXXFILESUFFIX'] = '.cxx'
>env['QT4_UICDECLSUFFIX'] = '.hxx'
>env.moveIntermediateInto('generated')
>env.activateColorCommandLine()
>if not env['verbose']: env.ClamQuietCompilation()
>env.EnableClamModules(libs=[
>   'clam_core',
>   'clam_audioio',
>   'clam_processing',
>   ], path=CLAMInstallDir)
>env.EnableQt4Modules([
>   'QtCore',
>   'QtGui',
>   'QtOpenGL',
>#  'QtSql',
>#  'QtNetwork',
>#  'QtTest',
>#  'QtXml',
>#  'QtSvg',
>#  'QtUiTools',
>#  'QtDesigner',
>#  'Qt3Support',
>   ], debug=False,
>   crosscompiling=crosscompiling,
>   )
>sourcePaths = []
>extraPaths = [
>   CLAMInstallDir+'/include',
>   CLAMInstallDir+'/include/CLAM', # KLUDGE to keep old style includes
>]
>includePaths = sourcePaths + extraPaths
>sources = scanFiles('*.cxx', sourcePaths)
>sources = unique(sources)
>singleSourceExamples = [
>   "WritingProcessings.cxx",
>   "NetworkPersistence_example.cxx",
>   "NetworkUsage_example.cxx",
>   "AudioFileReading_example.cxx",
>   "AudioFileWriting_example.cxx",
>   "AudioIOExample.cxx",
>#  "Configurators_example.cxx", # QT4Port
>   "DescriptorComputation_example.cxx",
>   "FDFilterExample.cxx",
>   "FFT_example.cxx",
>   "FileInfo_example.cxx",
>   "FilePlayback_example.cxx",
>   "FundamentalDetect.cxx",
>   "LPCAnalysis_example.cxx", # TODO FLTK Dependencies -> Qt4
>   "Midi2XmlExample.cxx",
>   "MIDIFileReadWriteExample.cxx",
>   "MIDIIOExample.cxx",
>   "MIDIOut_example.cxx",
>   "MIDI_Synthesizer_example.cxx",
>   "NetworkPersistence_example.cxx",
>   "NetworkUsage_example.cxx",
>   "OfflineAudioConvolution.cxx",
>   "PersistenceThroughDTs_example.cxx",
>   "POCompositeExample.cxx",
>   "SimplePortsUsage_example.cxx",
>   "ProcessingLifeCycle_example.cxx",
>   "ProcessingObject_controls_example.cxx",
>   "SDIF_And_Segment_example.cxx", # TODO: FLTK Dependencies
>   "Spectrum_example.cxx",
>   "StereoToMonoFile.cxx",
>#  "ThreadedProcessing_example.cxx", # TODO: Depends on Resample and FLTK
>   "Tutorial/UserTutorial1.cxx",
>   "Tutorial/UserTutorial2.cxx",
>   "Tutorial/UserTutorial3.cxx",
>   "Tutorial/UserTutorial4.cxx",
>   "Tutorial/UserTutorial5.cxx",
>   "Tutorial/UserTutorial6.cxx",
>]
>directoryBasedExamples = [
>   "PortsAndControlsUsageExample",
>   "ControlArrayExamples",
>   "Wav2SDIF",
>   "SDIF2Wav",
>   "SDIF2WavStreaming",
>]
>directoryBasedLibraries = [
>#  "PluginExamples/ClamLadspaPluginExample",
>   "PluginExamples/ClamNativePluginExample",
>]
>singleSourceLibraries = [
>]
>env.Append(CPPPATH=includePaths)
>env.AppendUnique(CPPFLAGS=["-g", "-Wall"])
>#env.AppendUnique(DEFINES=["_DEBUG"])
>examples = []
>for libsource in singleSourceLibraries :
>   library = os.path.basename(libsource)
>   examples += [ env.SharedLibrary(source = libsource ) ]
>for folder in directoryBasedLibraries :
>   librarySources = glob.glob(folder+"/*.cxx")
>#  librarySources += [env.EmbededFile(file) for file in glob.glob(folder+"/*.clamnetwork")]
>   library = os.path.basename(folder)
>   examples += [ env.SharedLibrary(target=library, source = librarySources ) ]
>for main in singleSourceExamples :
>   executable = os.path.splitext(os.path.basename(main))[0]
>   examples += [ env.Program(target=executable, source = sources + [main] ) ]
>for folder in directoryBasedExamples :
>   exampleSources = glob.glob(folder+"/*.cxx")
>   executable = os.path.basename(folder)+"Exe"
>   examples += [ env.Program(target=executable, source = sources + exampleSources ) ]
>if not crosscompiling :
>   # Still having problems crosscompiling aubio
>   tickEnv = env.Clone()
>   tickEnv.ParseConfig('pkg-config aubio --cflags --libs')
>   tickEnv.ParseConfig('pkg-config samplerate --cflags --libs')
>   tickSrc = glob.glob("TickExtractor/*cxx")
>   examples += [ tickEnv.Program(target="TickExtractorExe", source = tickSrc) ]
>env.Alias('examples',examples)
>env.Default(examples)
1

There are 1 best solutions below

1
On

I don't think that you have to change anything in the SConstruct, this error doesn't seem to be related to SCons at all from my angle. The error message shows that your installation of /usr/local/lib/libclam_core.so depends on the unresolved symbols. This will give you trouble, even when trying to link "clam_core" against a simple C++ main program on the command line.

Try to check the dynamic dependencies for the "clam_core" lib with "ldd". Can the dlopen calls be resolved in the standard shell? If this works at the command line, but not in SCons, you possibly have set LD_LIBRARY_PATH in your shell environment to make things work. Then you'd have to propagate this path to SCons as well, or, even better, install the needed CLAM libs properly, such that their dependencies get resolved without the need for LD_LIBRARY_PATH.

Check your installation of the CLAM libs. Did you compile them from source, or did you use a binary package? In the latter case, did you pick the right one for your machine/architecture?