我一直在尝试编译以下网站上给出的代码以创建一个usrp对象https://kb.ettus.com/getting_started_with_uhd_and_and_c++
对于懒惰的生病,只需包括代码:
#include <uhd/utils/thread_priority.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/exception.hpp>
#include <uhd/types/tune_request.hpp>
#include <boost/program_options.hpp>
#include <boost/format.hpp>
#include <boost/thread.hpp>
#include <iostream>
int UHD_SAFE_MAIN(int argc, char *argv[]) {
uhd::set_thread_priority_safe();
std::string device_args("addr=192.168.10.2");
std::string subdev("A:0");
std::string ant("TX/RX");
std::string ref("internal");
double rate(1e6);
double freq(915e6);
double gain(10);
double bw(1e6);
//create a usrp device
std::cout << std::endl;
std::cout << boost::format("Creating the usrp device with: %s...") % device_args << std::endl;
uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(device_args);
// Lock mboard clocks
std::cout << boost::format("Lock mboard clocks: %f") % ref << std::endl;
usrp->set_clock_source(ref);
//always select the subdevice first, the channel mapping affects the other settings
std::cout << boost::format("subdev set to: %f") % subdev << std::endl;
usrp->set_rx_subdev_spec(subdev);
std::cout << boost::format("Using Device: %s") % usrp->get_pp_string() << std::endl;
//set the sample rate
if (rate <= 0.0) {
std::cerr << "Please specify a valid sample rate" << std::endl;
return ~0;
}
// set sample rate
std::cout << boost::format("Setting RX Rate: %f Msps...") % (rate / 1e6) << std::endl;
usrp->set_rx_rate(rate);
std::cout << boost::format("Actual RX Rate: %f Msps...") % (usrp->get_rx_rate() / 1e6) << std::endl << std::endl;
// set freq
std::cout << boost::format("Setting RX Freq: %f MHz...") % (freq / 1e6) << std::endl;
uhd::tune_request_t tune_request(freq);
usrp->set_rx_freq(tune_request);
std::cout << boost::format("Actual RX Freq: %f MHz...") % (usrp->get_rx_freq() / 1e6) << std::endl << std::endl;
// set the rf gain
std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
usrp->set_rx_gain(gain);
std::cout << boost::format("Actual RX Gain: %f dB...") % usrp->get_rx_gain() << std::endl << std::endl;
// set the IF filter bandwidth
std::cout << boost::format("Setting RX Bandwidth: %f MHz...") % (bw / 1e6) << std::endl;
usrp->set_rx_bandwidth(bw);
std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % (usrp->get_rx_bandwidth() / 1e6) << std::endl << std::endl;
// set the antenna
std::cout << boost::format("Setting RX Antenna: %s") % ant << std::endl;
usrp->set_rx_antenna(ant);
std::cout << boost::format("Actual RX Antenna: %s") % usrp->get_rx_antenna() << std::endl << std::endl;
return EXIT_SUCCESS;
}
i首先是通过代码块利用GCC编译器,然后决定使用mingw测试GCC和G 通过命令行,两者在编译时都导致了:
main.cpp:17: undefined reference to `_imp___ZN3uhd24set_thread_priority_safeEfb'
main.cpp:32: undefined reference to `_imp___ZN3uhd13device_addr_tC1ERKSs'
main.cpp:32: undefined reference to `_imp___ZN3uhd4usrp10multi_usrp4makeERKNS_13device_addr_tE'
main.cpp:40: undefined reference to `_imp___ZN3uhd4usrp13subdev_spec_tC1ERKSs'
main.cpp:56: undefined reference to `_imp___ZN3uhd14tune_request_tC1Ed'
objDebugmain.o: In function `ZN3uhd4usrp10multi_usrp11set_rx_gainEdj':
multi_usrp.hpp:595: undefined reference to `_imp___ZN3uhd4usrp10multi_usrp9ALL_GAINSE'
objDebugmain.o: In function `ZN3uhd4usrp10multi_usrp11get_rx_gainEj':
multi_usrp.hpp:637: undefined reference to `_imp___ZN3uhd4usrp10multi_usrp9ALL_GAINSE'
collect2.exe: error: ld returned 1 exit status
我阅读了有关将LIB文件链接到项目的信息,但是我下载的API似乎没有任何.lib,.a或任何其他LIB类型文件。我从他们的网站http://files.ettus.com/manual/page_install.html。
任何类型的帮助都将不胜感激,我一直在努力弄清楚几个小时的问题。注意,我在Windows 10 OS上工作。
这些都是链接器错误,嘿,您必须添加链接器库。
我不知道您已经下载了什么,但是Windows安装程序应该随Windows下链接所需的.lib和.dll。否则,如果您已经下载了源代码,则必须按照手册在Windows上构建UHD,并将结果库添加到您的链接列表中。
编译时您是否在命令行中使用-luhd
选项?
如果您安装了UHD,很可能您已经将库正确添加到Incluber路径中,并添加该选项将解决该问题。
因此g++
线应该看起来像:
g++ my_file.cpp -o program_name -luhd