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函数,一切正常啦!

4、完

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐