GNURadio C ++ OOT Extrernal(.so)库

时间:2018-02-01 12:02:04

标签: linker gnuradio .so

我尝试为GNURadio编译OOT模块,它使用外部设备驱动程序(LimeSuite.h)作为动态链接的共享对象(.so文件)。添加后

find_package(LimeSuite)

和cmake / Modules下的相应模块(参见https://github.com/kit-cel/gr-dab/blob/working_branch/cmake/Modules/FindFaad.cmake),我能够用make编译并观察到,以下变量发生了变化。

CMAKE_CXX_FLAGS=-lLimeSuite
LIMESUITE_FOUND=1
LIMESUITE_FOUND=1
LIMESUITE_INCLUDE_DIR=/usr/include
LIMESUITE_INCLUDE_DIRS=/usr/include
LIMESUITE_LIBRARIES=/usr/lib/x86_64-linux-gnu/libLimeSuite.so
LIMESUITE_LIBRARY=/usr/lib/x86_64-linux-gnu/libLimeSuite.so

然而,只要我在代码中使用该库,当我尝试实例化python对象时,就会出现以下错误。

AttributeError: 'module' object has no attribute 'limesdr_source'

只要我从块的实现部分使用库删除C ++代码,实例化就会再次运行。我没有收到任何执行make的错误报告。怎么会这样?知道如何进一步调试吗?

编辑:

正如下面MarcusMüller的回答所指出的,我没有正确联系。实际上,必须在三个位置编辑三个不同的cmake文件,以将外部动态加载的库(.so)添加到GNURadio中的OOT模块。我试着简要解释一下该做什么:

  1. find_package(LIBNAME)放在OOT模块基目录的 CMakeLists.txt 中。
  2. 对应于cmake模块路径中的 FindLIBNAME.cmake 文件是必要的。此文件的目的是实现搜索包含目录和库文件(.so文件)。
  3. 找到该库的路径后,必须与 lib / CMakeLists.txt (链接)中的 target_link_libraries(...)一起使用。
  4. 包含文件路径,即 LIBNAME.h 必须使用 CMakeLists.txt中的 include_directories(...)添加为包含目录在模块的基目录中。
  5. 使用ldd可以确定外部库是否正确链接。

    ldd /usr/local/lib/YOURLIB.so
    

1 个答案:

答案 0 :(得分:3)

您可能忘记将limesuite对象文件添加到lib / CMakeLists.txt中的实际链接库中。

无论如何,我看到为什么你应该在与OAB +有关的OOT和几乎与硬件无关的情况下与limesuite链接的零理由。相反,将您的石灰接口封装在您自己的OOT中的块中! GNU Radio旨在成为一个块连接框架,因此您不必将信号处理块代码与硬件接口驱动程序相链接。

生成自己的OOT应该非常简单,确实:https://tutorials.gnuradio.org