【问题标题】:Strange error: undefined reference to `class::class()'奇怪的错误:对 `class::class()' 的未定义引用
【发布时间】:2016-05-31 07:03:35
【问题描述】:

我有一个依赖于另一个库 irRNG 的库 irWGN。

我的 CMakeFiles.txt 如下。一个是src/signals是

add_library(irRNG irRNG.cpp)
add_library(irWGN irWGN.cpp)

和主要的 CMakeFile

include_directories(${SRC}/signals)
SET(MY_LIB
  ${MY_LIB}
  irRNG
  irWGN
  )
....

foreach(file2link ${FILES_to_RUN})

  target_link_libraries(${file2link}
    ${catkin_LIBRARIES}
    ${Boost_LIBRARIES}
    ${gsl_LIBRARIES}
    ${OpenCV_LIBRARIES}
    ${MY_LIB}
    )
   add_dependencies(${file2link} project_generate_messages_cpp)
endforeach(file2link)

遇到这个错误

./devel/lib/libirWGN.so: undefined reference to `irRNG::irRNG()'
../devel/lib/libirWGN.so: undefined reference to `irRNG::~irRNG()'

奇怪的是我在 ubuntu 12.04 上使用它没有任何问题。现在才出现这个问题。

【问题讨论】:

  • 你还记得target_link_libraries() 吗?
  • 错误消息涉及库irWGN,但您仅显示库irRNG 的创建。如果不查看相关代码,我们将无法为您提供帮助。
  • @polar 您还需要报告 cmake irWGN 相关代码。我指出的丢失的“.cpp”呢?
  • set(MYLIB...中交换irRNG和irWGN如果不起作用,请报告完整的失败行,make VERBOSE=1如果你使用make
  • @polar 是的。如今,如果你做得正确(首先依赖库,之后依赖库),你将不需要重复库。不是你的情况,但是cmake也可以处理circular dependencies

标签: c++ compiler-errors linker cmake undefined


【解决方案1】:

由于问题在于您的 irWGN 取决于您的 irRNG,解决问题的最优雅方法是添加:

target_link_libraries(irWGN irRNG)

在您的库之间建立相互依赖关系。它也适用于静态库!因此,如果您尝试将可执行文件链接到 irWGN,cmake 也会自动链接到 irRNG,并且顺序正确。

【讨论】:

  • 我想强调这不是“最优雅的方式”。不过非常感谢!!事实上,人们根本不应该关心订单。您的库(文件数量)越大,在采用您的解决方案时就会遇到更多的麻烦
  • 由于我认为应该有更好的解决方案,所以我会等待是否有人提出建议,然后再确认您的解决方案。但我对你的解决方案投了赞成票。
  • @polar 如果一个库依赖于另一个库,例如您的 libirWGN 依赖于您的 libirRNG,则必须在某处说明。这是最优雅的方式。与组成库的文件数量无关。顺便说一句,请参阅本指南的第一点“库目标名称”:cmake.org/cmake/help/v3.5/command/target_link_libraries.html
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2012-09-16
  • 2013-03-20
  • 2013-01-19
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多