GNURadio C++ OOT Extrernal (.so) Library



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

find_package(LimeSuite)

以及 cmake/模块下的相应模块(参见 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 的错误报告。这怎么可能?知道如何进一步调试吗?

编辑:

正如下面马库斯·穆勒的回答所指出的那样,我没有正确链接。事实上,必须在三个地方编辑三个不同的cmake文件,才能将外部动态加载的库(.so)添加到GNURadio中的OOT模块中。我尝试简要解释该怎么做:

  1. CMakeList中放置一个find_package(LIBNAME).txt 在 OOT 模块的基目录中。
  2. 与此相对应,cmake 模块路径中的FindLIBNAME.cmake文件是必需的。此文件用于实现对包含目录和库文件(.so 文件)的搜索。
  3. 找到库的路径必须与lib/CMakeLists中的target_link_libraries(...)一起使用.txt(链接)。
  4. 包含文件路径,即LIBNAME.h必须使用CMakeList中的include_directories(...)添加为包含目录.txt在模块的基本目录中。

使用 ldd,可以找出外部库是否正确链接。

ldd /usr/local/lib/YOURLIB.so

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

无论如何,我认为您应该在与DAB+和几乎硬件无关的OOT中链接到limesuite的充分理由为零。相反,将您的石灰接口封装在您自己的 OOT 中的块中!GNU Radio 被设计为一个块连接框架,因此您不必将信号处理块代码与硬件接口驱动程序链接起来。

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

最新更新