Ошибка в компоновщике c ++ linux Scons: проект CLAM

0

Я пытаюсь построить и связать примеры с проектом CLAM. Я связываюсь и получаю следующую ошибку. Я не знаю, что случилось.

>== 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.

Может ли кто-нибудь помочь мне в этом. Какие изменения следует внести в SConstruct, показанные ниже:

>## #!/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)
  • 0
    Похоже, вам не хватает libdl. Не уверен, где вы добавите его, хотя.
  • 0
    Спасибо; Я так думаю, но где, мне тоже интересно ...
Показать ещё 2 комментария
Теги:
linker
scons

1 ответ

2

Я не думаю, что вам нужно что-то менять в SConstruct, эта ошибка, похоже, не связана с SCons от моего угла. Сообщение об ошибке показывает, что ваша установка /usr/local/lib/libclam_core.so зависит от неразрешенных символов. Это вызовет проблемы даже при попытке связать "clam_core" с простой основной программой C++ в командной строке.

Попробуйте проверить динамические зависимости для библиотеки clam_core с помощью "ldd". Можно ли разрешить вызовы dlopen в стандартной оболочке? Если это работает в командной строке, но не в SCons, возможно, вы установили LD_LIBRARY_PATH в среду оболочки, чтобы все работало. Тогда вам придется распространять этот путь и на SCons, или, что еще лучше, установить необходимые библиотеки CLAM правильно, чтобы их зависимости решались без LD_LIBRARY_PATH.

Проверьте установку CLAM-библиотек. Вы скомпилировали их из источника или использовали бинарный пакет? В последнем случае вы выбрали правильный вариант для своей машины/архитектуры?

  • 0
    спасибо за ответы. На самом деле я скомпилировал из исходного кода, поэтому получил бинарные файлы без ошибок. Что касается пути, я проверил, и, похоже, у меня проблема с "ldd", установка пути мне пока не помогла ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню