C++分目录存放头文件与源文件编译失败求助
分目录编译C++程序失败的问题与解决方法
目录结构
test ├── inc │ └── A.h ├── src │ └── A.cpp └── test.cpp
各文件代码
test.cpp
#include <iostream> #include "inc\A.h" int main() { std::cout << A(); return 0; }
A.h
#ifndef A_H #define A_H int A(); #endif
A.cpp
#include "..\inc\A.h" int A() { return 1; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(CPPproject) SET(MAIN test.cpp) SET(CMAKE_CXX_STANDARD 17) SET(Home "D:\study\test") SET(EXECUTABLE_OUTPUT_PATH ${Home}) include_directories("${PROJECT_SOURCE_DIR}/inc") file(GLOB MAIN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") file(GLOB MAIN_HEAD "${CMAKE_CURRENT_SOURCE_DIR}/inc/*.h") add_executable(test ${MAIN})
错误信息
[build] CMakeFiles\test.dir/objects.a(test.cpp.obj): In function `main': [build] D:/study/test/test.cpp:4: undefined reference to `A()' [build] collect2.exe: error: ld returned 1 exit status
问题与需求
将主文件中的#include "inc\A.h"替换为#include "src\A.cpp"后编译成功,但这种方式不规范,求正确解法及原因。
原因分析
这是链接阶段错误:
- CMake配置中,
add_executable(test ${MAIN})只指定编译test.cpp,未将src/A.cpp加入编译列表。编译后仅生成test.cpp的目标文件,其中只有A()的声明(来自头文件),没有具体实现,链接器找不到对应代码因此报错。 - 用
#include "src\A.cpp"是把A.cpp的代码直接嵌入test.cpp,编译时会一起生成包含A()实现的目标文件,链接自然能成功,但这种写法会导致代码冗余、重复编译风险(如果其他文件也包含该源文件),完全不符合工程规范。
正确解法
修改CMakeLists.txt中的add_executable行,将src目录下的源文件加入编译列表:
add_executable(test ${MAIN} ${MAIN_SRC})
另外,由于已经通过include_directories("${PROJECT_SOURCE_DIR}/inc")将inc目录加入头文件搜索路径,test.cpp中的头文件引用可以简化为:
#include "A.h"
这种写法更规范,也避免了路径硬编码问题。
内容的提问来源于stack exchange,提问作者Akarin akaza
相关产品推荐
相关产品推荐

