1、问题描述
先看看项目结构
head.h
文件内容如下
#ifndef A
#define A
// 声明函数原型
void sum1(int a,int b);
#endif
head.cpp
文件内容如下
#include "iostream"
//引入自定义头文件
#include "head.h"
// 函数实现
void sum1(int a,int b){
std::cout << "我是sum1" << std::endl;
}
lesson_17_head_file_main.cpp
是启动函数main的文件,内容如下
#include "head.h"
int main() {
sum1(1,2);
return 0;
}
启动后报以下错误,整了好久都不明白是啥原因,明明已经实现了函数,为啥还说找不到这个函数的引用;
报错原文如下
====================[ Build | lesson_17_header_file-lesson_17_head_file_main | Debug ]====
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/yexindong/Documents/project_cpp/cpp_learn/cmake-build-debug --target lesson_17_header_file-lesson_17_head_file_main -- -j 6
Consolidate compiler generated dependencies of target lesson_17_header_file-lesson_17_head_file_main
[ 50%] Building CXX object CMakeFiles/lesson_17_header_file-lesson_17_head_file_main.dir/lesson_17_header_file/lesson_17_head_file_main.cpp.o
[100%] Linking CXX executable lesson_17_header_file-lesson_17_head_file_main
Undefined symbols for architecture x86_64:
"sum1(int, int)", referenced from:
_main in lesson_17_head_file_main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [lesson_17_header_file-lesson_17_head_file_main] Error 1
make[2]: *** [CMakeFiles/lesson_17_header_file-lesson_17_head_file_main.dir/all] Error 2
make[1]: *** [CMakeFiles/lesson_17_header_file-lesson_17_head_file_main.dir/rule] Error 2
make: *** [lesson_17_header_file-lesson_17_head_file_main] Error 2
2、查找原因
经过长达三小时的艰苦奋战,终于找到了问题所在,一切都是CMakeLists.txt
搞得鬼,因为我要写多个main方法,所以就偷懒,写了个foreach,遍历所有目录下的.cpp文件,自动编译;但是并不是每个cpp文件下都有main函数的,所以我猜有些没有main函数的cpp文件就会跳过,而我刚刚写的 head.cpp文件刚好就没有main函数,也就不会编译,最终导致找不到函数的实现;
3、解决问题
最终我将CMakeList.txt
需改了一下,注释掉foreach代码,以及在add_executable
函数内添加head.cpp
和 lesson_17_head_file_main.cpp
的文件路径,改之后的内容如下,记得按 ctrl + S
进行保存
cmake_minimum_required(VERSION 3.23)
project(lern_cpp)
set(CMAKE_CXX_STANDARD 14)
# 添加头文件路径
#include_directories(${PROJECT_SOURCE_DIR}/lesson_20_class/include)
#include_directories(${PROJECT_SOURCE_DIR}/lesson_17_header_file/head.hpp)
# 遍历项目根目录和子目录下所有的 .cpp 文件
#file (GLOB files *.cpp */*.cpp)
#foreach (file ${files})
# string(REGEX REPLACE ".+/(.+)/(.+)\\..*" "\\1-\\2" exe ${file})
# add_executable (${exe} ${file} )
#endforeach ()
# 若需要手动 reload CMakeLists.txt 文件,将下面注释放开,在注释,然后按 Ctrl + S 保存即可
add_executable(cpp_1 lesson_17_header_file/head.cpp lesson_17_header_file/lesson_17_head_file_main.cpp)
然后在执行lesson_17_head_file_main.cpp
文件中的main函数,一切正常啦!