问题描述
主文件对其它文件内容调用时,明明已经正确引用相关头文件,并确保类和函数已被定义,仍然出现下面问题。
CMakeFiles/robot_pose_ukf_node.dir/src/main.cpp.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
main.cpp:(.text+0x232):对‘FusionUKF::FusionUKF()’未定义的引用
main.cpp:(.text+0x258):对‘DataPoint::DataPoint()’未定义的引用
collect2: error: ld returned 1 exit status
问题解决
在构建多个文件时,注意不要每个头文件下都引用相同的头文件,如果不能确保单个文件依赖的独立性,就统一小范围文件的的相关性,避免在统一个应用场景下重复多次无顺序的调用同一个头文件,莫名其妙的报错是真难受。
第一步
细心检查头文件是否出现引用错乱、重复引用问题;确保引用的函数和类已经正确定义。
第二步
检查CMakeLists.txt文件,确保include文件和对应的.cpp文件被检索编译,检查的关键内容见代码块。(代码块中的内容可以直接添加到CMakeLists.txt文件中的最后一行)
其中,robot_pose_ukf_node是main函数定义的ROS节点,节点后的.cpp文件是定义节点的主文件和可供节点调用的其它文件。/opt/ros/melodic/lib/libcsm.so是ROS的动态链接库。(使用时注意和ROS版本以及自己的定义的ROS节点对应)
include_directories(include ${catkin_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS})
include_directories(include/${PROJECT_NAME})
add_executable(robot_pose_ukf_node src/datapoint.cpp
src/measurementpredictor.cpp
src/statepredictor.cpp
src/stateupdater.cpp
src/fusionukf.cpp
src/main.cpp
src/tools.cpp)
target_link_libraries(robot_pose_ukf_node
${catkin_LIBRARIES}
/opt/ros/melodic/lib/libcsm.so
)