Неопределенная ссылка[USRP] [UHD]

Я пытался скомпилировать код, приведенный на следующем веб-сайте, для создания объекта USRP https://kb.ettus.com/Getting_Started_with_UHD_and_C%2B%2B

Для ленивых просто включите код:

#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;
}

Сначала я использовал компилятор GCC через блоки кода, затем решил протестировать gcc и g++ с помощью MinGW через командные строки, оба во время компиляции привели к следующему:

    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'
    obj\Debug\main.o: In function `ZN3uhd4usrp10multi_usrp11set_rx_gainEdj':
    multi_usrp.hpp:595: undefined reference to `_imp___ZN3uhd4usrp10multi_usrp9ALL_GAINSE'
    obj\Debug\main.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.


person zapper9595    schedule 23.02.2017    source источник


Ответы (2)


Все это просто ошибки компоновщика, говорящие о том, что вы должны добавить библиотеки компоновщика.

Я не знаю, точно что вы скачали, но установщики Windows должны поставляться с .lib и .dll, необходимыми для компоновки под Windows. в противном случае, если вы загрузили исходный код, вам придется следовать руководству по сборке UHD в Windows и добавить полученную библиотеку в список ссылок.

person Marcus Müller    schedule 23.02.2017
comment
Мне удалось найти файл .lib для UHD и связать его, перейдя в настройки компоновщика моего проекта и добавив каталог, в котором находится файл .lib, но я продолжаю получать те же ошибки. Файл представляет собой библиотеку моделей pspice, я не знаю, связано ли это с чем-либо. - person zapper9595; 23.02.2017
comment
эй, zapper, очень сложно удаленно отлаживать что-то подобное, но если вы все еще получаете те же ошибки компоновщика, вы не использовали правильную библиотеку или используете ее не в том месте. - person Marcus Müller; 23.02.2017
comment
Я думаю, что бинарная установка пропустила некоторые файлы, я свяжусь с ними и посмотрю, что они скажут, спасибо, Маркус! - person zapper9595; 23.02.2017

Используете ли вы параметр -luhd в командной строке при компиляции?

Если вы установили uhd, скорее всего, у вас уже правильно добавлена ​​библиотека в путь включения, и добавление этой опции решит проблему.

Таким образом, строка g++ должна выглядеть так:

g++ my_file.cpp -o program_name -luhd
person Oznerol    schedule 09.08.2018