CMake项目引用头文件出现未定义引用错误的技术求助
解决 "undefined reference to CascadeLoader::CascadeLoader()" 链接错误
这个错误是典型的链接阶段缺失实现代码的问题——你通过头文件告诉编译器CascadeLoader类的存在,但链接器找不到这个类构造函数(以及其他成员)的实际实现代码。
为什么包含.cpp文件能运行?
当你#include "CascadeLoader.cpp"时,相当于把这个cpp文件的所有代码直接复制到main.cpp里一起编译,编译器自然能找到构造函数的实现。但这是非常糟糕的做法,会导致代码重复编译、编译时间变长,还容易引发符号重复定义的问题,绝对不要这么用。
正确的解决步骤
1. 修正头文件包含路径
在main.cpp里,你需要确保能正确找到头文件。根据你的目录结构,头文件在./resources/headers/CascadeLoader.h,可以这样包含:
#include "../resources/headers/CascadeLoader.h"
或者后续通过CMake配置头文件搜索路径后,直接写#include "CascadeLoader.h"即可。
2. 修改CMakeLists.txt,添加CascadeLoader.cpp到编译源
你的CMakeLists.txt目前应该只把main.cpp加入了编译目标,但CascadeLoader.cpp的代码也需要被编译并链接到最终可执行文件里。修改后的CMakeLists示例如下:
cmake_minimum_required(VERSION 2.8) project(ASLInterpreter) # 找到OpenCV依赖包(补全你未写完的配置) find_package(OpenCV REQUIRED) # 添加头文件搜索路径,让编译器能找到resources/headers下的头文件 include_directories(${PROJECT_SOURCE_DIR}/resources/headers) # 列出所有需要编译的源文件 set(SOURCES src/main/cpp/main.cpp src/main/cpp/CascadeLoader.cpp ) # 生成可执行文件,并链接OpenCV库 add_executable(${PROJECT_NAME} ${SOURCES}) target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
3. 重新构建项目
删除原有的build目录(如果存在),重新执行构建命令:
mkdir build && cd build cmake .. make
这样操作后,链接器就能找到CascadeLoader::CascadeLoader()的实现代码,错误应该就会消失。
内容的提问来源于stack exchange,提问作者Andre Ellis
相关产品推荐
相关产品推荐

