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

Undefined reference error despite linking target libraries

提问人:ZincFur 提问时间:2/20/2016 最后编辑:VertexwahnZincFur 更新时间:2/21/2016 访问量:701

问:

我在理解以下错误时遇到了一些麻烦。

我在 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错误。我不认为这是一个编码错误,因为我的库编译和链接成功。

C++ cmake 静态库 链接器错误 未定义引用

评论

3赞 user4581301 2/20/2016
没有代码就无法确定,但既然您提到了“ball_popping.h/ball_popping.cpp”,听起来您遇到了为什么模板只能在头文件中实现?
0赞 ZincFur 2/21/2016
这是正确的。我修改了代码,将实现作为 .tpp 文件包含在头文件的末尾。感谢您的回复。

答:

1赞 ZincFur 2/21/2016 #1

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