尽管链接目标库,但未定义的引用错误

问题描述:

我在理解以下错误时遇到了一些麻烦。尽管链接目标库,但未定义的引用错误

我有一个类的声明/定义在ball_popping.h/ball_popping.cpp中。这个班是一个模板班。

我想将上面的代码编译成一个库,并将它们与我使用上述类的成员函数的主文件game.cpp链接起来。

我的CMakeLists.txt是如下,

set(EXECUTABLE_NAME ball_popping) 
set(LIBRARY_NAME ball_popping_lib) 

add_library(${LIBRARY_NAME} STATIC ball_popping.cpp ${INCLUDE_FILES}) 
add_executable(${EXECUTABLE_NAME} game.cpp) 
target_link_libraries(${LIBRARY_NAME} ${Precompiled_LIBRARIES})   
target_link_libraries(${EXECUTABLE_NAME} ${LIBRARY_NAME}) 

库编译和链接成功。可执行编译成功但链接引发错误

CMakeFiles/ball_popping.dir/game.cpp.o: In function `int proficio_main<3ul>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3ul>&, config)': 
game.cpp:(.text._Z13proficio_mainILm3EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE6config[int proficio_main<3ul>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3ul>&, config)]+0x553): undefined reference to `ballpopping::BallPopping<3ul>::BallPopping(barrett::math::Matrix<3, 1, barrett::units::CartesianPosition> const&, UserGravComp<3ul>&, bool const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
game.cpp:(.text._Z13proficio_mainILm3EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE6config[int proficio_main<3ul>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3ul>&, config)]+0x1176): undefined reference to `ballpopping::BallPopping<3ul>::InEllipsoid(barrett::math::Matrix<3, 1, barrett::units::CartesianPosition> const&) const' 
game.cpp:(.text._Z13proficio_mainILm3EEiiPPcRN7barrett14ProductManagerERNS2_7systems3WamIXT_EEE6config[int proficio_main<3ul>(int, char**, barrett::ProductManager&, barrett::systems::Wam<3ul>&, config)]+0x119a): undefined reference to `ballpopping::BallPopping<3ul>::IsDistanced(barrett::math::Matrix<3, 1, barrett::units::CartesianPosition> const&)' 
CMakeFiles/ball_popping.dir/game.cpp.o:(.rodata._ZTVN11ballpopping11BallPoppingILm3EEE[vtable for ballpopping::BallPopping<3ul>]+0x28): undefined reference to `ballpopping::BallPopping<3ul>::operate()' 
collect2: ld returned 1 exit status 

为BallPopping,inContact公司()和InEllipsoid()构造函数ball_popping.cpp内被定义。

我想知道这是否是cmake错误。我不能认为它是编码错误,因为我的图书馆编译和链接成功。

+2

不能确定没有代码,但是因为你提到了“ball_popping.h/ball_popping.cpp”,这听起来像是你已经遇到了[为什么模板只能在头文件中实现?](http:// *.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – user4581301

+0

这是现货。我修改了代码,将实现作为一个.tpp文件包含在头文件的末尾。感谢您的答复。 – ZincFur

感谢@ user4581301的输入。在头部末尾包含来自另一个文件的模板定义确实解决了这个问题。