我正在使用ubuntu 14.04而我正试图从github安装UHD设备,但我收到了一个不允许它构建的错误。
checking whether the Boost::System library is available... yes
checking for exit in -lboost_system... yes
checking whether the Boost::Thread library is available... yes
checking for exit in -lboost_thread... yes
checking whether the Boost::Regex library is available... yes
checking for exit in -lboost_regex... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
willie.thompson@seb215-wks07:~/redhawk/USRP_UHD/cpp$ make
CXX USRP_UHD-USRP_UHD.o
CXX USRP_UHD-USRP_UHD_base.o
CXX USRP_UHD-main.o
CXX USRP_UHD-template_impl.o
CXXLD USRP_UHD
/usr/bin/ld: USRP_UHD-USRP_UHD.o: undefined reference to symbol 'uuid_generate_random@@UUID_1.0'
//lib/x86_64-linux-gnu/libuuid.so.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [USRP_UHD] Error 1
seb215-wks07:~/redhawk/USRP_UHD/cpp$
我在这里做错了什么或是Ubuntu的问题?
答案 0 :(得分:0)
目前,您可以编辑Makefile.am文件来解决此问题。在USRP_UHD_LDADD行的末尾添加-luuid,那么您应该能够成功重建它。
答案 1 :(得分:0)
Ubuntu14中使用的g ++版本比CentOS6中使用的版本更严格。幸运的是,g ++提供了关于问题的良好提示。
/ usr / bin / ld:USRP_UHD-USRP_UHD.o:对符号'uuid_generate_random @@ UUID_1.0'的未定义引用 //lib/x86_64-linux-gnu/libuuid.so.1:添加符号时出错:命令行中缺少DSO
它基本上是说“你想要的是libuuid.so.1,但你没有把它放在命令行上,所以我拒绝使用它”。虽然在CentOS6中g ++不那么严格,但无论如何都是链接,假设这就是你想要的。
您有两种选择,一种是快速简便的方法,一种是更好的长期解决方案:
1)在详细模式下再次运行make,这将显示正在进行的呼叫,并且您可以修复违规呼叫。让我们这样做:
make V=1
< ... a bunch of calls to g++ that work fine or nothing if these have already run prior .... >
g++ -Wall -D__x86_64__ -D__linux__ -D__OSVERSION__=2 -DENABLE_EVENTS=1 -I/var/lib/redhawk/core/include -I/var/lib/redhawk/core/include/ossie -I/var/lib/redhawk/core/share/idl -pthread -I/usr/include -I/var/lib/redhawk/core/include/frontend -I/var/lib/redhawk/core/include/redhawk -I/var/lib/redhawk/core/include/bulkio -I/var/lib/redhawk/core/include/ossie -g -O2 -Wall -o USRP_UHD USRP_UHD-USRP_UHD.o USRP_UHD-USRP_UHD_base.o USRP_UHD-main.o USRP_UHD-template_impl.o -L/var/lib/redhawk/core/lib64 -lossiecf -lossieidl -lCOS4 -lomniDynamic4 -lomniORB4 -lomnithread -L/usr/lib/x86_64-linux-gnu -lboost_thread -lboost_regex -lboost_system -L/var/lib/redhawk/core/lib64 -lfrontend-2.2.0 -lfrontendInterfaces -lbulkio-1.10 -lbulkioInterfaces -luhd -llog4cxx
/usr/bin/ld: USRP_UHD-USRP_UHD.o: undefined reference to symbol 'uuid_generate_random@@UUID_1.0'
//lib/x86_64-linux-gnu/libuuid.so.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [USRP_UHD] Error 1
好的,现在我们有一个长期难看的g ++调用,我们只需要在链接库列表中添加“-luuid”,这样我们就可以在最后添加它了瞧!它会毫无错误地返回。请注意,我们只需手动运行其中一个g ++调用,以便进行良好的测量运行。如果有任何其他构建步骤,请再次运行;在这种情况下没有,它只会说“无所事事”
2)更好的修复!所以构建文件显然需要一些修复。
如果我们看看configure.ac,我们会看到有这样的调用:
PKG_CHECK_MODULES([LIBUHD], [uhd >= 3.5.3])
这是做什么的“检查模块uhd的pkg-config,确保它是版本&gt; = 3.5.3并将任何构建相关信息存储在以LIBUHD为前缀的变量中,以便我以后可以使用它” 。听起来像我们想要的。我们可以通过查看它知道的所有软件包来检查pkg-config是否知道libuuid:
pkg-config --list-all
这将向我们展示pkg-config所知道的一切,我们发现它知道了uuid。所以,让我们在检查UHD驱动程序的正下方为configure.ac添加一行,看看它有什么影响。我的行看起来像这样:
PKG_CHECK_MODULES([LIBUUID], [uuid])
我没有版本限制。好的,现在为了整合这个更改,我们需要重新运行reconf脚本,然后我们可以看到配置输出。
./reconf
./configure
<....a bunch of stuff....>
checking for LIBUUID... yes
<....a bunch more stuff....>
那是新的!我们现在在配置调用中检查uuid库,如果你看一下config.log文件,则添加了新的变量:
LIBUUID_CFLAGS =' - I / usr / include / uuid' LIBUUID_LIBS =' - luuid'
好吧,差不多了!看一下Makefile.am文件。这里使用这些变量并指示对g ++的调用。将我们新制作的LIBUUID_CFLAGS和LIBUUID_LIBS变量附加到USRP_UHD_LDADD和USRP_UHD_CXXFLAGS变量的末尾,就像我在下面所做的那样。
USRP_UHD_LDADD = $(PROJECTDEPS_LIBS) $(BOOST_LDFLAGS) $(BOOST_THREAD_LIB) $(BOOST_REGEX_LIB) $(BOOST_SYSTEM_LIB) $(INTERFACEDEPS_LIBS) $(redhawk_LDADD_auto) $(LIBUHD_LIBS) $(LIBUUID_LIBS)
USRP_UHD_CXXFLAGS = -Wall $(PROJECTDEPS_CFLAGS) $(BOOST_CPPFLAGS) $(INTERFACEDEPS_CFLAGS) $(redhawk_INCLUDES_auto) $(LIBUHD_FLAGS) $(LIBUUID_CFLAGS)
由于我们已经更改了Makefile.am文件,我们需要重新运行./configure。经验法则是./reconf从configure。*文件创建配置脚本,而./configure从Makefile。*文件创建Makefile,因此如果您编辑下游文件,则需要重新运行上游脚本。
好吧,既然我们已经完成了那件事应该有效!我们使用configure.ac文件通过pkg-config添加了对libuuid的系统检查,将结果存储在变量中并在我们的makefile模板中使用它。
这对redhawk来说并不是唯一的,所以如果您想了解更多信息,那么autotools构建系统和pkg-config上会有大量文档。