我正在使用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出了问题?
发布于 2015-08-06 06:21:57
现在,您可以编辑Makefile.am文件来修复此问题。在USRP_UHD_LDADD行的末尾添加-luuid,那么您应该能够成功地重新构建它。
发布于 2015-08-07 20:49:18
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“添加到链接库的列表中,这样我们就可以在最后添加它了!它将返回而不会出现错误。请注意,我们只是手动运行了1个g++调用,所以为了更好地衡量,再次运行Make,以防有任何额外的构建步骤;在这种情况下,没有,它将简单地说“什么都不做”。
2)更好的修复!因此,构建文件显然需要一些修复。
如果我们看一下configure.ac,我们会看到有像这样的调用:
PKG_CHECK_MODULES([LIBUHD], [uhd >= 3.5.3])它所做的是“检查模块uhd的pkg-config,确保它是>= 3.5.3版本,并将任何构建相关信息存储在以LIBUHD为前缀的变量中,以便我以后可以使用它”。听起来就是我们想要的。我们可以通过查看pkg-config所知道的所有包来查看它是否知道libuuid:
pkg-config --list-all这将向我们显示pkg-config所知道的所有信息,并且我们看到它知道uuid。因此,让我们在检查超硬盘驱动程序的正下方向configure.ac添加一行代码,看看这会有什么影响。我的代码行是这样的:
PKG_CHECK_MODULES([LIBUUID], [uuid])我没有设置版本约束。好的,现在为了将更改合并进来,我们需要重新运行reconf脚本,然后我们可以看到配置输出。
./reconf
./configure
<....a bunch of stuff....>
checking for LIBUUID... yes
<....a bunch more stuff....>这是新的!我们现在正在检查configure调用中的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。经验法则是./reconf从config.*文件创建您的配置脚本,而./configure从您的Makefile.*文件创建Makefile,因此如果您编辑一个下游文件,您需要重新运行上游脚本。
好了,现在我们已经完成了,事情应该可以工作了!我们使用configure.ac文件通过pkg-config添加了对libuuid的系统检查,将结果存储在一个变量中,并在makefile模板中使用该变量。
所有这些都不是redhawk独有的,所以如果你想了解更多信息,有很多关于autotools构建系统和pkg-config的文档。
https://stackoverflow.com/questions/31734566
复制相似问题