当前位置: 首页 > news >正文

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

文章目录

  • 1、问题描述
  • 2、查找原因
  • 3、解决问题
  • 4、完

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.cpplesson_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、完

http://www.dtcms.com/a/302494.html

相关文章:

  • 《LeetCode 热题 100》整整 100 题量大管饱题解套餐 中
  • Ubuntu-安装S7nodave教程
  • Java面试宝典:MySQL事务和事务的隔离级别
  • C++现代Redis客户端库redis-plus-plus详解
  • Redis实战(3)-- 高级数据结构zset
  • Linux应用程序架构与软件包管理
  • 【Linux】基本指令(2)
  • 未提交读的问题
  • 3. Socket 编程 TCP
  • 广播,数据库01 day43
  • JVM垃圾收集算法和垃圾收集器
  • 阿里云通义灵码深度解析:AI编程时代的技术革命与实践探索
  • 基于Hadoop3.3.4+Flink1.17.0+FlinkCDC3.0.0+Iceberg1.5.0整合,实现数仓实时同步mysql数据
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine
  • python导包机制-更优方式
  • 新华三H3CNE网络工程师认证—Telnet
  • 《 服务注册发现原理:从 Eureka 到 Nacos 的演进》
  • 7、Docker 常用命令大全
  • Python + Requests库爬取动态Ajax分页数据
  • Qt:盒子模型的理解
  • WebSocket双向通信——引入进行功能优化
  • opencv学习(轮廓检测)
  • ACL 访问控制列表全解析:从规则语法到实战配置
  • 旧物回收小程序:科技赋能,让旧物回收焕发生机
  • Avalonia的自定义边框窗口
  • React中为甚么强调props的不可变性
  • TMS320F2812PGFA TI:150MHz工业级DSP控制芯片,电机控制专用
  • 腾讯AI IDE
  • 天学网面试 —— 中级前端开发岗位
  • 动/静态库的原理及制作