我正在尝试从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 库的安装。您是从源代码编译它们,还是使用二进制包?在后一种情况下,您是否为您的机器/架构选择了正确的产品?