clion解决引入头文件后找不到函数实现:Undefined symbols for architecture x86_64

发布时间:2023-03-19 23:20:55 作者:yexindonglai@163.com 阅读(1840)

1、问题描述

先看看项目结构

head.h文件内容如下

  1. #ifndef A
  2. #define A
  3. // 声明函数原型
  4. void sum1(int a,int b);
  5. #endif

head.cpp 文件内容如下

  1. #include "iostream"
  2. //引入自定义头文件
  3. #include "head.h"
  4. // 函数实现
  5. void sum1(int a,int b){
  6. std::cout << "我是sum1" << std::endl;
  7. }

lesson_17_head_file_main.cpp 是启动函数main的文件,内容如下

  1. #include "head.h"
  2. int main() {
  3. sum1(1,2);
  4. return 0;
  5. }

启动后报以下错误,整了好久都不明白是啥原因,明明已经实现了函数,为啥还说找不到这个函数的引用;

报错原文如下

  1. ====================[ Build | lesson_17_header_file-lesson_17_head_file_main | Debug ]====
  2. /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
  3. Consolidate compiler generated dependencies of target lesson_17_header_file-lesson_17_head_file_main
  4. [ 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
  5. [100%] Linking CXX executable lesson_17_header_file-lesson_17_head_file_main
  6. Undefined symbols for architecture x86_64:
  7. "sum1(int, int)", referenced from:
  8. _main in lesson_17_head_file_main.cpp.o
  9. ld: symbol(s) not found for architecture x86_64
  10. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  11. make[3]: *** [lesson_17_header_file-lesson_17_head_file_main] Error 1
  12. make[2]: *** [CMakeFiles/lesson_17_header_file-lesson_17_head_file_main.dir/all] Error 2
  13. make[1]: *** [CMakeFiles/lesson_17_header_file-lesson_17_head_file_main.dir/rule] Error 2
  14. 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.cpplesson_17_head_file_main.cpp的文件路径,改之后的内容如下,记得按 ctrl + S 进行保存

  1. cmake_minimum_required(VERSION 3.23)
  2. project(lern_cpp)
  3. set(CMAKE_CXX_STANDARD 14)
  4. # 添加头文件路径
  5. #include_directories(${PROJECT_SOURCE_DIR}/lesson_20_class/include)
  6. #include_directories(${PROJECT_SOURCE_DIR}/lesson_17_header_file/head.hpp)
  7. # 遍历项目根目录和子目录下所有的 .cpp 文件
  8. #file (GLOB files *.cpp */*.cpp)
  9. #foreach (file ${files})
  10. # string(REGEX REPLACE ".+/(.+)/(.+)\\..*" "\\1-\\2" exe ${file})
  11. # add_executable (${exe} ${file} )
  12. #endforeach ()
  13. # 若需要手动 reload CMakeLists.txt 文件,将下面注释放开,在注释,然后按 Ctrl + S 保存即可
  14. 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、完

关键字c++