OOT module error linking to gr::filter::mmse_fir_interpolator_cc in 3.7

This is a case of “everything used to just work” in 3.6 and below, our
Gardner/Costas block relies on this functionality; i.e., it did a
#include of gri_mmse_fir_interpolator_cc.h and contructed a new one via
“new gri_mmse_fir_interpolator_cc()”.

Of course I changed the above (respectively) for 3.7 to
#include <gnuradio/filter/mmse_fir_interpolator_cc.h>
and
… new gr::filter::mmse_fir_interpolator_cc()

However in 3.7 there is a linker failure
libgnuradio-op25_repeater.so: undefined reference to
`gr::filter::mmse_fir_interpolator_cc::mmse_fir_interpolator_cc()’
(etc)

A very quick initial diagnosis is that it used to be in
libgnuradio-core.so in 3.6 and below, but now it’s been split out into
libgnuradio-filter.so in 3.7 - whereas the framework generated by
gr_modtool only links to libgnuradio-runtime (in 3.7) which of course
doesn’t contain the mmse interpolator …

As a workaround I’ve added a find_library() for libgnuradio-filter.so to
the lib/CMakeLists.txt which seems to make everything happy… Not sure
this is even a bug, just mentioning it in case someone else porting to
3.7 may be bitten by it…

Max

On Sat, Oct 5, 2013 at 3:03 PM, ikjtel [email protected] wrote:

However in 3.7 there is a linker failure
As a workaround I’ve added a find_library() for libgnuradio-filter.so to the
lib/CMakeLists.txt which seems to make everything happy… Not sure this
is even a bug, just mentioning it in case someone else porting to 3.7 may be
bitten by it…

Max

Yeah, this isn’t a bug, it’s how it is supposed to work. Since we’ve
moved all signal processing code out of gnuradio-runtime, you’ll have
to pull in other libraries for these different tools and functions.
Since the filter stuff all lives in the gr::filter:: namespace, you
know that it’s in the libgnuradio-filter.so library.

This is one reason that I recommend using the new GnuradioConfig.cmake
tool for finding and linking to GNU Radio from your OOT module. For
this case, you need to link against the runtime and filter libraries
for the 3.7 API version. So you would put this in your CMakeLists.txt
code:

set(GR_REQUIRED_COMPONENTS RUNTIME FILTER)
find_package(Gnuradio 3.7.0)

That makes sure that both libgnuradio-runtime and libgnuradio-filter
from API version 3.7.0 (and up) are found. It also sets the cmake
variables for the necessary include directory and library locations
that you would use elsewhere to set your include directories and
library linking targets.

Tom