C++ 奇怪的错误:未定义对“class::class()';

C++ 奇怪的错误:未定义对“class::class()';,c++,compiler-errors,linker,cmake,undefined,C++,Compiler Errors,Linker,Cmake,Undefined,我有一个依赖于另一个库irRNG的库irWGN 我的CMakeFiles.txt如下所示。一个是src/signals add_library(irRNG irRNG.cpp) add_library(irWGN irWGN.cpp) 和主文件 include_directories(${SRC}/signals) SET(MY_LIB ${MY_LIB} irRNG irWGN ) .... foreach(file2link ${FILES_to_RUN}) tar

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

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

add_library(irRNG irRNG.cpp)
add_library(irWGN irWGN.cpp)
和主文件

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()'

奇怪的是,我在Ubuntu12.04上使用它时没有任何问题。直到现在这个问题才出现

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

target_link_libraries(irWGN irRNG)

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

您是否记得
target\u link\u libraries()
?错误消息涉及library
irWGN
,但您只显示创建库
irRNG
。如果不查看相关代码,我们将无法帮助您。您还需要报告cmake irWGN相关代码。我指出的丢失的“.cpp”怎么办?在
集合(MYLIB…
中交换irRNG和irWGN如果不起作用,请报告完整的失败行,
make VERBOSE=1
,如果您正在使用make@polar是的。现在,如果你做得正确(先看图书馆,后看图书馆)您不需要重复库。这不是您的情况,但cmake也可以处理。我想强调的是,这不是“最优雅的方式”。但非常感谢!!事实上,您根本不应该关心订单。您的库(文件数)越大,在采用您的解决方案时,您会遇到更多的麻烦因为我认为应该有更好的解决方案,我会等到有人提出一些建议后再确认您的解决方案。但我投票支持了您的解决方案。@polar如果一个库依赖于另一个库,就像您的libirWGN依赖于您的libirRNG,则必须在某个地方声明。这是最优雅的方式。与组成库的文件数量无关。顺便说一句,请参阅本指南的第一点“库目标名称”: