.h 和 .cpp 位于不同文件夹时编译文件失败

问题描述 投票:0回答:1

我是 C++ 初学者。我将头文件和源文件存储在不同的文件夹中,如下所示。当我尝试编译时,我无法编译成功。

test
├── inc
│   └── A.h
├── src
│   └── A.cpp
└── test.cpp

测试.cpp

#include <iostream>
#include "inc\\A.h"
int main() {
    std::cout << A();
    return 0;
}

啊啊

#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"
,编译成功。但是,我不明白其背后的原因。这种做法看起来不太正常。

c++ compiler-errors
1个回答
0
投票

您当前未在编译中包含

A.cpp
,链接器需要它来解析
A()
函数。

您的

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} ${MAIN_SRC})

这实际上会将名为

A.cpp
的源文件包含到您的编译中。

为什么当您将

A.cpp
文件包含到
tests.cpp
文件中时它会起作用,因为实际的函数定义最终在您的
test.cpp
文件中,并且
A()
函数与其余代码一起编译在
test.cpp
文件。

© www.soinside.com 2019 - 2024. All rights reserved.