我是 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"
,编译成功。但是,我不明白其背后的原因。这种做法看起来不太正常。
您当前未在编译中包含
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
文件。