【问题标题】:How can I add third party library to gnuradio block using cmake?如何使用 cmake 将第三方库添加到 gnuradio 块?
【发布时间】:2018-01-05 18:09:11
【问题描述】:

在过去的两天里,我试图在 gnuradio 中创建新块,但是当我尝试执行流程图时,我不断收到错误:

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

我认为我试图在我的项目中使用的第 3 方库 (opennn) 存在一些问题。在主源文件 (test_impl.cc) 中,我已经导入了 opennn 头文件。在函数 general_work 我正在调用函数:

   int
    test_impl::general_work (int noutput_items,
                       gr_vector_int &ninput_items,
                       gr_vector_const_void_star &input_items,
                       gr_vector_void_star &output_items)
    {
      const float *in = (const float *) input_items[0];
      float *out = (float *) output_items[0];
       OpenNN::NeuralNetwork nn(8, 1, 1);

      // Do <+signal processing+>
      // Tell runtime system how many input items we consumed on
      // each input stream.
      consume_each (noutput_items);

      // Tell runtime system how many output items we produced.
      return noutput_items;
    }

我的 lib/CMakeLists.txt(在 lib 文件夹中,我有自动生成的 gnuradio 块源文件和带有 opennn 库的目录):

########################################################################
# Setup library
########################################################################
include(GrPlatform) #define LIB_SUFFIX

include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})

list(APPEND tutorial3_sources
    test_impl.cc
)

set(tutorial3_sources "${tutorial3_sources}" PARENT_SCOPE)
if(NOT tutorial3_sources)
    MESSAGE(STATUS "No C++ sources... skipping lib/")
    return()
endif(NOT tutorial3_sources)

add_library(gnuradio-tutorial3 SHARED ${tutorial3_sources})
target_link_libraries(gnuradio-tutorial3 ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES})
set_target_properties(gnuradio-tutorial3 PROPERTIES DEFINE_SYMBOL "gnuradio_tutorial3_EXPORTS")

if(APPLE)
    set_target_properties(gnuradio-tutorial3 PROPERTIES
        INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
    )
endif(APPLE)
########################################################################
# Install built library files
########################################################################
include(GrMiscUtils)
GR_LIBRARY_FOO(gnuradio-tutorial3 RUNTIME_COMPONENT "tutorial3_runtime" DEVEL_COMPONENT "tutorial3_devel")

########################################################################
# Build and register unit test
########################################################################
include(GrTest)

include_directories(${CPPUNIT_INCLUDE_DIRS})

list(APPEND test_tutorial3_sources
    ${CMAKE_CURRENT_SOURCE_DIR}/test_tutorial3.cc
    ${CMAKE_CURRENT_SOURCE_DIR}/qa_tutorial3.cc
)

add_executable(test-tutorial3 ${test_tutorial3_sources})

target_link_libraries(
  test-tutorial3
  ${GNURADIO_RUNTIME_LIBRARIES}
  ${Boost_LIBRARIES}
  ${CPPUNIT_LIBRARIES}
  gnuradio-tutorial3
)

GR_ADD_TEST(test_tutorial3 test-tutorial3)

########################################################################
# Print summary
########################################################################
message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Building for version: ${VERSION} / ${LIBVER}")

我尝试添加以下代码:

########################################################################
# Install opennn library files
########################################################################
add_subdirectory(tinyxml2)
add_subdirectory(opennn)
include_directories(opennn)
add_subdirectory(examples)
add_subdirectory(blank)
add_subdirectory(tests)
include(CPack)

老实说,我已经尝试通过多种方式修改此 CMake 文件,但我总是收到此错误。

【问题讨论】:

  • // ,这可能看起来有点挑剔,但如果你将这个问题的标题改写成一个问题的形式,它可能会帮助你更快地得到答案我>。此外,在故障排除站点中,您通常会发布您遇到的错误,他们会引导您完成复制、查找根本原因等。不过,Stackoverflow 有点不同。看起来如果我们要就此进行对话,我可以重现您的问题,但您介意将您的问题重新表述为重现问题的分步指南吗?
  • 我已更改标题。对不起,我习惯在标题中使用标签而不是完整的句子。
  • // 没问题。通常,当我求助于 stackoverflow 问题时,我的头脑无论如何都是糊状的。我有一个在 gnuradio 方面有经验的朋友,我会看看他是否觉得这很有趣。我们如何重现这个问题?
  • 1.在 gnuradio 中创建新模块。 2.在gnu radio(通用类型)中创建新块。 3. 在自动生成的文件中,添加 Opennn 库 from:opennn.net 4. 对新创建的块进行最小配置(添加一个输入,一个输出,只是为了确保它可以编译) 5. 在主源文件 [BLOCK_NAME]_impl.cpp导入 "opennn.h" 6. 添加 OpenNN::NeuralNetwork nn(8, 1, 1);此函数为general_work 方法。 7. 接下来编译这个块,将它添加到 gnuradio。 8. 在 gnuradio 中创建流:信号源 -> 油门 ->[OUR_BLOCK]->QT Time Sink 9. 执行流图。就是这样
  • @Paweł 你有没有得到这个问题的答案? - 我制作了自己的库并安装了它(复制到 /usr/shared/libs 等),并且可以通过使用标志 -lmylib 进行编译来将其与其他通用 c++ 代码一起使用。但是当我想将它与 gnuradio 一起使用时——一旦我包含了正确的头文件,它似乎编译得很好,但我得到了和你一样的错误......我正在尝试解决这个问题,但还没有运气:(

标签: c++ cmake gnuradio


【解决方案1】:

您的问题为我提供了解决问题的线索,我认为这与此处描述的相同,但我不确定。我的解决方案是将缺少的外部库 yaml-cpp 添加到我的 GnuRadio 模块的文件 lib/CMakeLists.txt 中的 target_link_libraries 指令中。

target_link_libraries(gnuradio-AUK gnuradio::gnuradio-runtime yaml-cpp)

我正在添加一些 C++ YAML 代码来解析配置文件。它编译得很好,但给出了难以理解的信息:

AttributeError: module ... has no attribute ...

现在全部修复。非常感谢您提供的线索。

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 2019-10-31
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多