gnuradio `ImportError неопределенный символ`

Я новичок в GNU Radio и Python. Я пытаюсь написать блок корреляции, где-то в моем коде я использую фильтр FFT:

gr::filter::kernel::fft_filter_ccc  *d_filter;
d_filter = new gr::filter::kernel::fft_filter_ccc(1, x_vector);
d_filter->filter(noutput_items,in_y,out);

я бегу

cmake ../
make 

и это соответствует совершенно нормально, но когда я пытаюсь

make test

Я получу эту ошибку:

 Traceback (most recent call last):
2:   File "/home/mohammad/projects/FD/implementation_tests/oot_modules/gr-full_duplex/python/qa_fd_correlation_cc.py", line 25, in <module>
2:     import full_duplex_swig as full_duplex
2:   File "/home/mohammad/projects/FD/implementation_tests/oot_modules/gr-full_duplex/build/swig/full_duplex_swig.py", line 28, in <module>
2:     _full_duplex_swig = swig_import_helper()
2:   File "/home/mohammad/projects/FD/implementation_tests/oot_modules/gr-full_duplex/build/swig/full_duplex_swig.py", line 24, in swig_import_helper
2:     _mod = imp.load_module('_full_duplex_swig', fp, pathname, description)
2: ImportError: /home/mohammad/projects/FD/implementation_tests/oot_modules/gr-full_duplex/build/lib/libgnuradio-full_duplex.so: undefined symbol: _ZN2gr6filter6kernel14fft_filter_cccC1EiRKSt6vectorISt7complexIfESaIS5_EEi
1/1 Test #2: qa_fd_correlation_cc .............***Failed    1.30 sec

2 ответа

Решение

Это часто происходит, когда вы объявили метод в заголовочном файле, но не реализовали его. Например, деструктор или что-то еще.

Чтобы узнать, какой это метод, вы должны разобрать неопределенный символ _ZN2gr6filter6kernel14fft_filter_cccC1EiRKSt6vectorISt7complexIfESaIS5_EEi,

Это можно сделать с помощью c++filt инструмент. Например,

c++filt \ _ZN2gr6filter6kernel14fft_filter_cccC1EiRKSt6vectorISt7complexIfESaIS5_EEi

В вашем случае этот символ является существующим символом Радио GNU, расположенным в gr-filter модуль. Каждый модуль GNU Radio создает библиотеку, поэтому для решения неопределенной проблемы с символами необходимо связать ее с необходимой библиотекой. Для этого вам необходимо выполнить следующие шаги:

На CMakeLists.txt файл вашего модуля, укажите, от каких компонентов GNU Radio вы зависите. В вашем случае FILTER составная часть.

set(GR_REQUIRED_COMPONENTS RUNTIME FILTER)
find_package(Gnuradio "3.7.0" REQUIRED)

Дополнительные зависимости могут быть вставлены, например:

set(GR_REQUIRED_COMPONENTS RUNTIME FILTER DIGITAL)

После этого вы можете использовать ${GNURADIO_ALL_INCLUDE_DIRS} а также ${GNURADIO_ALL_LIBRARIES} автоматически сгенерированные переменные для правильного включения правильных заголовочных файлов и ссылки на соответствующие библиотеки. Например:

include_directories(
    ${CMAKE_SOURCE_DIR}/lib
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_BINARY_DIR}/lib
    ${CMAKE_BINARY_DIR}/include
    ${Boost_INCLUDE_DIRS}
    ${CPPUNIT_INCLUDE_DIRS}
    ${GNURADIO_RUNTIME_INCLUDE_DIRS}
    ${GNURADIO_ALL_INCLUDE_DIRS}
)

target_link_libraries(gnuradio-howto
                      ${Boost_LIBRARIES}
                      ${GNURADIO_RUNTIME_LIBRARIES}
                      ${GNURADIO_ALL_LIBRARIES})

Для получения дополнительной информации обратитесь сюда.

Обновление для ответа @manos: начиная
с GNU Radio 3.8+ файлы CMakeList.txt немного изменились.

Строка, которую нужно изменить на верхнем уровне CMakeList.txtявляется:

      find_package(Gnuradio "3.8" REQUIRED COMPONENTS blocks analog filter fft)

И в lib/CMakeList.txt:

      target_link_libraries(gnuradio-tempest gnuradio::gnuradio-runtime gnuradio::gnuradio-blocks gnuradio::gnuradio-fft gnuradio::gnuradio-filter Volk::volk)

Источник: https://wiki.gnuradio.org/index.php/GNU_Radio_3.8_OOT_Module_Porting_Guide

Другие вопросы по тегам