Swig and python import problem due to other out-of-tree modules used in my out-of-tree module

I’ve asked this question before. But there are lots of ambiguity and
uncertainty. Thus, this is the clarification.

I am using Reed-Solomon En/decoder in my own OOT module sources. The
Reed-Solomon en/decoder are implemented in gr-dvbt.

Important codes are:

[include/reed_solomon.h](

)
include/reed_solomon_enc.h
lib/reed_solomon.cc
lib/reed_solomon_end_impl.h
lib/reed_solomon_end_impl.cc

I’ve built and installed my module. But when I import my module in
Python
for tests, error occurs:

>>> import myOOTmodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File

“/usr/local/lib/python2.7/dist-packages/myOOTmodule/init.py”, line
51,
in
from myOOTmodule_swig import *
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 28, in
_myOOTmodule_swig = swig_import_helper()
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 24, in swig_import_helper
_mod = imp.load_module(‘_myOOTmodule_swig’, fp, pathname,
description)
ImportError: /usr/local/lib/libgnuradio-myOOTmodule.so: undefined
symbol: _ZN2gr4dvbt12reed_solomonC1Eiiiiiiii

You can also see the error above in gist

The problem is that the above error occurs since I am using
gr:dvbt::reed_solomon, which is neither in GNU Radio source tree nor in
my
module.

I don’t know the exact reason for this. But in my guess…
It seems that myOOTmodule thinks gr::dvbt::reed_solomon is a part of
myOOTmodule itself. But there is no declaration and implementation and
it
causes the error.
Or myOOTmodule has no idea where to import gr:dvbt:reed_solomon.

Another hypothesis is that, an OOT module cannot use other OOT modules
(in
swig-python?). I’m not sure about it. Or, there is a way to do this, but
I
just don’t know about it.

Regards,
Jeon.

Jeon,

I’ve recently dealt with a similar problem. Chances are that if things
are building and installing correctly but the error is in the SWIG
import, the actual problem lies in your CMakeLists.txt… seems like the
C++ linker is being smart enough to get things linked correctly but SWIG
needs you to be a bit more explicit.

Is there another project that includes Reed-Solomon that you can
reference? See what changes they made to their CMakesLists.txt to get
SWIG to be happy.

-Doug


From: discuss-gnuradio-bounces+danderson=removed_email_address@domain.invalid
[discuss-gnuradio-bounces+danderson=removed_email_address@domain.invalid] on behalf
of Jeon [[email protected]]
Sent: Sunday, March 29, 2015 10:25 PM
To: Discuss GNU Radio mailing list
Subject: [Discuss-gnuradio] Swig and python import problem due to other
out-of-tree modules used in my out-of-tree module

I’ve asked this question before. But there are lots of ambiguity and
uncertainty. Thus, this is the clarification.

I am using Reed-Solomon En/decoder in my own OOT module sources. The
Reed-Solomon en/decoder are implemented in
gr-dvbt.

Important codes are:

[include/reed_solomon.h](https://github.com/BogdanDIA/gr-dvbt/blob/master/include/dvbt/reed_solomon.h)
[include/reed_solomon_enc.h](https://github.com/BogdanDIA/gr-dvbt/blob/master/include/dvbt/reed_solomon_enc.h)
[lib/reed_solomon.cc](https://github.com/BogdanDIA/gr-dvbt/blob/master/lib/reed_solomon.cc)
[lib/reed_solomon_end_impl.h](https://github.com/BogdanDIA/gr-dvbt/blob/master/lib/reed_solomon_enc_impl.h)
[lib/reed_solomon_end_impl.cc](https://github.com/BogdanDIA/gr-dvbt/blob/master/lib/reed_solomon_enc_impl.cc)

I’ve built and installed my module. But when I import my module in
Python for tests, error occurs:

>>> import myOOTmodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File 

“/usr/local/lib/python2.7/dist-packages/myOOTmodule/init.py”, line
51, in
from myOOTmodule_swig import *
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 28, in
_myOOTmodule_swig = swig_import_helper()
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 24, in swig_import_helper
_mod = imp.load_module(‘_myOOTmodule_swig’, fp, pathname,
description)
ImportError: /usr/local/lib/libgnuradio-myOOTmodule.so: undefined
symbol: _ZN2gr4dvbt12reed_solomonC1Eiiiiiiii

You can also see the error above in
gist

The problem is that the above error occurs since I am using
gr:dvbt::reed_solomon, which is neither in GNU Radio source tree nor in
my module.

I don’t know the exact reason for this. But in my guess…
It seems that myOOTmodule thinks gr::dvbt::reed_solomon is a part of
myOOTmodule itself. But there is no declaration and implementation and
it causes the error.
Or myOOTmodule has no idea where to import gr:dvbt:reed_solomon.

Another hypothesis is that, an OOT module cannot use other OOT modules
(in swig-python?). I’m not sure about it. Or, there is a way to do this,
but I just don’t know about it.

Regards,
Jeon.

Hi Jeon,

do you specify gnuradio-dvbt as one of the libraries you link against?

Greetings,
Marcus

Dear Douglas,

Thank you for your answer.

Unfortunately, I couldn’t find other modules and projects that use
gr-dvbt
in their codes. Thus, I feel sort of being frustrated :frowning:

Or maybe I can handle it if you give me some details about CMakeLists.
As
you know, there are a number of CmakeLists in the project. Can it be
done
by modifying and fixing CMakeLists.txt under swig, python or project
root
directory?

As I am searching the web and archives, I’ve just found this thread.
Though I’ve not read carefully it yet and it’s been two years since that
thread was posted, I think it might be relevant with my case.

If you have any better suggestions, I will be very thankful to it.
Also, I will report my progress as soon as possible.

Regards,
Jeon.

2015-03-31 0:22 GMT+09:00 Anderson, Douglas J.
[email protected]:

Hi Jeon,

typically, you’d call a FindSomething function in the root CMakeList

find_library(GR_DVBT_LIBRARY
NAMES
gnuradio-dvbt
PATHS
/usr/lib
/usr/local/lib
/opt/local/lib
/sw/lib
)
or so. I guess “gnuradio-dvbt.so” should be the name of the installed
gr-dvbt library – please verify that this is correct.

Then add the resulting library name to the target_link_libraries
directive in lib/CMakeList.txt:

target_link_libraries(<project_name> ${Boost_LIBRARIES}
${GNURADIO_ALL_LIBRARIES} ${GR_DVBT_LIBRARY})
and
target_link_libraries(test-<project_name> ${Boost_LIBRARIES}
${GNURADIO_ALL_LIBRARIES} ${GR_DVBT_LIBRARY} <project_name>)

How is CMake able to find the headers you need to compile your module?
If you have written functionality to detect these headers, you can
probably do the same for the compiled gr-dvbt libraries.

Greetings,
Marcus

Dear, Marcus.

Thanks, it’s very helpful. But, stil somethings unresolved.

What I’ve done is:

In CMakeLists.txt of root:

find_package(DVBT)
if (NOT DVBT_FOUND) /* ommited */ endif()
include_directories(
    /* omitted */
    ${DVBT_INCLUDE_DIR}
)

Add cmake/Modules/FindDVBT.cmake. It’s quite
long.
And I found that shared object (so) is libgnuradio-dvbt.so.

In lib/CMakeLists.txt:

target_link_libraries(gnuradio-mymodule ${DVBT_LIBRARIES})

A result of build and installation is:

pkg_check_modules(PC_DVBT gnuradio-dvbt): returns package

‘gnuradio-dvbt’ not found

Although I’ve changed gnuradio-dvbt to gr-dvbt, dvbt gnuradio_dvbt,
gr_dvbt, libgnuradio-dvbt and other possible combinations, nothings
different.

But DVBT_LIBRARY returns /usr/local/lib/libgnuradio-dvbt.so and
DVBT_INCLUDE_DIR returns /usr/local/include.
I think this part is correct.

And in python:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File

“/usr/local/lib/python2.7/dist-packages/myOOTmodule/init.py”, line
51,
in
from myOOTmodule_swig import *
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 28, in
_myOOTmodule_swig = swig_import_helper()
File
“/usr/local/lib/python2.7/dist-packages/myOOTmodule/myOOTmodule_swig.py”,
line 24, in swig_import_helper
_mod = imp.load_module(‘_myOOTmodule_swig’, fp, pathname,
description)
ImportError: /usr/local/lib/libgnuradio-myOOTmodule.so: undefined
symbol: _ZN2gr4dvbt12reed_solomonC1Eiiiiiiii

It is the same as the previous.

After some googling and searching, I found that gr-dvbt is not present
in
‘pkg-config --list-all’.
I think it would be a bit relevant to this problem.
If it is the case, I’d better think to use IT++ Reed Solomon.

I’ll let you know if I have further progress.

Regards,
Jeon.

2015-03-31 18:32 GMT+09:00 Marcus Müller [email protected]:

Dear, Marcus.

Struggling for this, but still the problem is not solved.

AND ONE THING I’VE FOUND IS:

>>> import dvbt
>>> dir(dvbt)

There are no reed_solomon, reed_solomon_make, reed_solomon_sptr,
reed_solomon_sptr_swigregister and reed_solomon_swigregister. But, there
are reed_solomon_end_XX and reed_solomon_dec_XX. (XX is _make, sptr
things)
Do you think this has something to do with my probelm? I think there is
no
reed_solomon
(…) module, thus I can’t use gr:dvbt::reed_solomon in
MYMODULE.
Can it be solved if I modify gr-dvbt to have _make, _sptr, _swigregister
things? But, I wonder if it is a good way to modify other’s sources. On
the
contrary, it might be good if I can contribute to the gr-dvbt sources.

Or is it irrelevant with my problem?
Anyway, I’ll try what I am thinking til some respones recevied.

Regards,
Jeon.

2015-03-31 23:50 GMT+09:00 Marcus Müller [email protected]:

Hi Jeon,

This looks very proper, but since gr-dvbt doesn’t supply a pkgconfig
(.pc) file, you can’t use pkg_check_modules; the raw find_library call
you use should work, though.

also, you set DVBT_LIBRARY, so you’ll have to use
target_link_libraries(gnuradio-mymodule ${DVBT_LIBRARY})
(notice the singular LIBRARY).

Greetings,
Marcus