You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:40:08