我是 C++ 初学者。我将头文件和源文件存储在不同的文件夹中,如下所示。当我尝试编译时,我无法编译成功。
test
├── inc
│ └── A.h
├── src
│ └── A.cpp
└── test.cpp
测试.cpp
#include <iostream>
#include "inc\\A.h"
int main() {
A<int> a;
std::cout << a.test();
return 0;
}
啊啊
#ifndef A_H
#define A_H
template <class T>
class A{
public:
int test();
};
#endif
A.cpp
#include "..\\inc\\A.h"
template<class T>
int A<T>::test() {
return 5;
}
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})
错误:
[build] [ 14%] Linking CXX executable D:\study\test\test.exe
[build] CMakeFiles\test.dir/objects.a(test.cpp.obj): In function `main':
[build] D:/study/test/test.cpp:165: undefined reference to `A<int>::test()'
[build] collect2.exe: error: ld returned 1 exit status
[build] mingw32-make.exe[2]: *** [CMakeFiles\test.dir\build.make:184: D:/study/test/test.exe] Error 1
[build] mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/test.dir/all] Error 2
[build] mingw32-make.exe: *** [Makefile:90: all] Error 2
感谢您的帮助。修改代码后终于发现了真正的问题。在我的 .h 文件中,有一个模板类。当我将其声明为常规类时,编译过程没有任何问题。但是,一旦我将其更改为模板,就会出现编译错误。
您当前未在编译中包含
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
文件。