链接器中的错误 c++ linux Scons : CLAM 项目



我正在尝试从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)
我认为

您不必在 SConstruct 中更改任何内容,从我的角度来看,此错误似乎与 SCons 完全无关。错误消息显示/usr/local/lib/libclam_core.so 的安装取决于未解析的符号。这会给您带来麻烦,即使尝试在命令行上将"clam_core"链接到简单的C++主程序。

尝试使用"ldd"检查"clam_core"库的动态依赖项。dlopen 调用可以在标准 shell 中解析吗?如果这在命令行中有效,但在 SCons 中不起作用,您可能已经在 shell 环境中设置了LD_LIBRARY_PATH以使事情正常工作。然后,您还必须将此路径传播到 SCons,或者更好的是,正确安装所需的 CLAM 库,以便在不需要LD_LIBRARY_PATH的情况下解析它们的依赖项。

检查 CLAM 库的安装。您是从源代码编译它们,还是使用二进制包?在后一种情况下,您是否为您的机器/架构选择了正确的产品?

最新更新