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