首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Dev-c++中将头文件头文件函数分离,编译函数跳出undefined reference to 的问题解决

更新时间:2022.5.13 8:00 在学习谭浩强c++第三版面向对象编程,第二章习题四: 需要实现三个文件分离,函数(.cpp),类的声明(头文件),对成员函数定义文件(.cpp)...单在使用Dev-C++实现,发现在编译一直出现undefined reference to set_value,也就是提示我们定义的这个函数未定义,但是我们定义了,所以应该是我们没有无法链接到函数实现文件...: 我们来分析一下: 这里的函数引入了define.cpp文件,相当于把define.cpp函数实现文件插入到main.cpp,而在define.cpp文件又引入类声明文件class.h,此时又相当于...总结: 在dev-c++是一个一个文件查找,需要使用相应文件功能就需要引入。...而在visual studio 2022 是创建文件是一个工程,在引入头文件,如果在该头文件有函数声明,那么在使用该头文件,vscode强大的链接功能会自动查找相应函数实现文件(只在当前目录下查找)

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

Visual Studio 万能头文件编译不了的解决方案

很多轻量级IDE cb devcpp 包括vscode都支持万能头文件,但是vs没有,但是敲代码的时候敲一个万能头文件岂不是省下很多事 如何解决?...最近开始使用VS,之前用的DEV C++软件可直接使用 #include ,但VS并没有,为了使用方便,可直接在VS添加此头文件, 链接 方法如下:...1.在安装路径下,依次进入: 1 VC --> Tools --> MSVC --> 14.13.35896(此文件夹名每个人会有不同) --> include 2.在 include 文件夹下新建一个...bits 文件夹,在此文件夹下添加 stdc++.h 头文件,就是下面的c head file, 比如我的VS安装在D盘,最后完成后的完整路径就是: 1 C:\Program Files (x86...)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.27508\include   之后VS 就可以直接添加头文件 #include

2.7K50

【Android 高性能音频】Oboe 开发流程 ( 导入 Oboe 库 | 使用构建的二进制库和头文件 | 编译 Oboe 源码 )

文章目录 一、导入 Oboe 库 二、使用构建的二进制库和头文件 三、编译 Oboe 源代码 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started...: 使用 构建的二进制库和头文件 ; ② 编译源码 : 直接 添加 Oboe 源码到工程 , 在 Android Studio 编译 Oboe 源码 ; Oboe 导入库方案适用场景 : 使用稳定功能...: 如果只想要 使用稳定版本的 Oboe 函数库 , 使用方案 ① ; 调试修改代码 : 如果想要 调试修改 Oboe 源代码 , 使用方案 ② ; 二、使用构建的二进制库和头文件 ---.../oboe) ③ 指定 Oboe 源码的头文件路径 : 允许本次 CMake 编译的目标库可以包含 Oboe 源码头文件 , 进而访问 Oboe API ; include_directories (...指定 Oboe 源码的头文件路径 # 允许本次 CMake 编译的目标库可以包含 Oboe 源码头文件 , 进而访问 Oboe API include_directories (${OBOE_DIR

94700

这篇文章不知道起什么名字

我这个文章不知道起什么名字,我就是在课堂上面搭建的了一个GCC的环境 help命令展示所有的帮助文件 打印所有平台的编译信息 gcc版本 对文件进行头文件展开 -E是展开头文件编译开关 这个开关是生成汇编语言...这是中间的文件,还没有组装 多文件编译 这个命令可以一次传多个源文件编译器 可以是指定的头文件编译 在这个文件里面可以看见我的头文件所在 打开编译过程的详细开关 -fverbose-asm:在编译成汇编语言时...,把C变量的名称作为汇编语言中的注释 这个可以一次编译许多的中间文件 -save-temps:自动输出预编译处理文件、汇编文件、对象文件编译正常进行 –help:显示gcc帮助说明 -target-help...:将多个原文件一次性传递给汇编器 -g:包含调试信息 -I:指定include包含文件的搜索目录 -o:输出成指定文件名 -v:详细输出编译过程中所采用的每一个选项 -ggdb:在可执行文件包含GDB...share_lib.so share_lib.c生成动态库文件share_lib.so 编写C头文件share_lib.h,写入函数的原型声明 编写函数app.c,引入头文件share_lib.h,然后就可以调用在动态库自定义的函数

70730

【Linux】基础IO --- 软硬链接、acm时间、动静态库制作、动静态链接、动静态库加载原理…

使用者直接gcc编译链接,会发生报错,显示找不到头文件。...gcc编译器在搜索头文件时,有两种搜索策略,一种是在当前路径(和源代码同级路径)下搜索,一种是在系统默认指定路径下搜索,当前路径下gcc确实找不到mylib库里面的头文件。 2....而头文件不需要指定头文件的名称,只需要头文件所在路径即可,那是因为源代码main.c告诉了编译器要包含什么头文件gcc会去指定路径下找特定的头文件。...但是当我们下一次登录xshell时,环境变量我们刚刚添加的路径会默认自动消失,所以在下一次登录时,mymath就又无法正常运行了,还会报找不到库文件的错误,如果想让路径永久生效,就需要改环境变量的配置文件...静态库不需要加载,在加载程序也就是编译链接时,系统就会将静态库的代码拷贝到可执行程序的代码段里面,因为可执行程序没有栈和堆段,只有代码段、数据段(可以细分为.data和.rodata段)和BSS段。

3.6K30

Makefile-只修改了.h头文件编译为什么不起作用?

不知道各位小伙伴是否碰到过这样的情况: 一个 .c 文件 include 另一个 .h 头文件,使用 Makefile 来构建(编译)应用程序。 第一次编译、执行,很正常!...但是此时,如果修改了 .h 头文件,再次编译时,就出现问题了: 预期的执行流程是:make 发现 .h 头文件的修改时间更新,于是重新编译包含这个头文件的所有 .c 文件。...@ 现在我们来第一次执行 make,编译一下: $ make gcc main.c -c -o main.o gcc -o main main.o 执行一下: $ ....make 的执行规则是:只有目标文件不存在,或者依赖文件比目标文件更新的时候,才会执行编译指令。 因此,虽然 hello.h 被修改了,但是它并不是目标文件 main.o 的依赖。...添加了 -include *.d 指令; 2. gcc 编译指令,添加了 -MMD 参数; 我们先执行一下试试。

4.2K30

GCC编译器基本使用方法

GCC是可以直接完成源文件编译。经常使用的命令就是直接生成一个可执行文件gcc文件 -o 可执行文件 这样的方式,可以把源文件直接编译为可执行文件,并且为可执行文件指定名称。...这个.out后缀对于Linux是没有意义的,Linux的文件类型就是那么几类。它不依文件后缀来区分文件类型。下面按照指定可执行文件的名称来编译一次。 ? GCC是可以分步编译文件的。...打开helloworld.i文件可以看到,头文件会被包含进来。形成一个很大的文件。接下来,将预处理过的文件进行编译。 ? 预处理使用选项“-E”。预处理阶段展开宏,文件包含,条件编译。...在链接过程,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序多个模块的外部引用。最终生成可执行文件。...gcc helloworld.o -o helloworld 上面的代码很简单,不需要链接什么,直接生成可执行文件。 ? 当头文件和源文件非常多的时候,使用GCC基本命令编译是非常麻烦的。

1.7K20

图解嵌入式系统开发之Makefile篇

因为该依赖关系只是 列出来了.c的依赖,没有描述对头文件的依赖,任何一个头文件的更改都需要重新编译所有文件。...归根到底这还是代码量级的问题,如果代码数量太大,编译一次需要数个小时,那么我们不可能每次都完整编译,最理想的情况是只编译修改过的C文件和受修改过的头文件影响的源文件。....$$ > $@” 在依赖关系文件添加xxx.d,使得对应的依赖文件也依赖于对应头文件。...Makefile: Makefile一般在源码的根目录下, 是执行Make命令读取的第一个Makefile文件,该文件定义了最终产物的名字,源文件的子目录,启动递归编译,合成最终产物规则,clean...该文件一次是被Makefile调用,后续该Makefile通过不断递归调用自己,同时搭配次Makefile来控制递归编译的进程。

1.2K40

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

-- 多个文件声明 : 两个文件中用到一个外部变量, 只能定义一次, 编译 和 连接的时候, 如果没有这个外部变量, 系统会知道这个外部变量在别处定义, 将另一个文件的外部变量扩展到本文件; extern...编译原则 :  -- 本文件能找到 : 编译器遇到 extern 的时候, 现在本文件找外部变量的定义的位置, 如果找到, 就将作用域扩展到 定义的位置 知道文件结束; -- 本文件找不到 : 如果本文件找不到..., 生命周期是整个程序的周期; 关于函数头文件的引申 :  -- 内部函数 : 单个文件中使用的内部函数, 仅在那个特定文件定义函数即可; -- 全局函数 : 如果要在整个工程中使用一个全局函数, 需要将这个函数定义在一个头文件...: static 局部变量 只初始化一次, 下一次依据上一次结果; static函数与普通函数区别 : static 函数在内存只保留一份, 普通函数 每调用一次, 就创建一个副本; . (6) 堆...; -- 内存限制 : stack 内存是连续的, 从高位向低位扩展, 而且很小, 只有几M, 是事先定好的, 在文件配置; heap 是不连续的, 从低位向高位扩展, 系统是由链表控制空闲程序, 链表从低地址到高地址

3.9K20

【C++】类的声明 与 类的实现 分开 ① ( 类的声明 与 类的实现 常用用法 | Visual Studio 2019 创建类的头文件和源文件 | 确保头文件包含一次 )

, 类的声明 与 类的实现 是分开的 , 这样可以使程序代码更清晰 , 易于管理 和 维护 ; 在 .h 后缀 的头文件 写 类的声明 代码 ; 在 .cpp 后缀 的源码文件 写 类的实现 代码...2019 创建类 的方法 ; 2、Visual Studio 2019 创建类的头文件和源文件 右键点击 " 解决方案资源管理器 " 的解决方案名称 , 在弹出的菜单中选择 " 添加 / 类 "...头文件内容如下 : 在该头文件 , 声明 Student 类 ; #pragma once class Student { }; 生成的 Student.cpp 源码文件如下 : 在该源码文件...实现类 ; #include "Student.h" 3、Student.h 类头文件解析 #pragma once 代码的作用是 确保 该头文件 在 整个程序 , 只能被 include 包含一次...__Student_H_ 在 C++ 可以都使用 ; 生成的默认类只有一个类名 , 没有其它内容 ; class Student { }; 4、确保头文件包含一次 确保头文件包含一次的方法 : C++

22930

【Linux】静态库和动态库

接下来我们在该目录下创建一个测试以上方法的函数 TestMain.c: 假设现在我们需要将上面的所有文件形成一个可执行程序测试,该如何编译呢?使用 gcc!...如: 如上图,为什么我们在编译的时候没有编译头文件呢?因为头文件在当前路径下,所以编译gcc 是可以直接找到的!...接下来我们将代码逻辑修改一下,首先新建一个目录 user 将用户写的函数放进去: 接下来我们形成 .o 文件头文件给到 user,我们暂时先不将这些文件进行打包: 所以使用者就可以自己将 main...现在我们回到用户的角度,我们只有一个函数: 我们现在需要用到库的方法,直接编译是会报错的,因为我们还没有对应的库。所以我们先使用最朴素的方法,先不进行打包。...那么现在我们的头文件既不在当前目录下,也不在系统路径下,没关系,我们可以在 gcc 带上选项 -I,后面带上头文件的路径即可,意思就是告诉 gcc 编译器除了在上面两个路径下找之外,还需要在我们指定的路径下找

16610

Android NDK开发扫盲及最新CMake的编译使用

比如指定使用c++11还是c++14编译,会引用哪些共享库,并描述关系等,还会指定编译的 abi。只有有了这些 NDK 编译工具才能准确的编译 c/c++ 代码。...命令头文件也复制到了 distribution_DIR 。 以上就是一个静态库/动态库的编译过程。...总结以下3点 编译静态库/动态库 修改输出路径 复制暴露的头文件 接着,我们看下 app 模块是如何使用建好的静态库/动态库的。...编辑好并 Sync 后,你就可以发现 hello-libs 的c/c++代码可以引用暴露的头文件调用内部方法了。...执行一次后会生成 makefile 的文件缓存之类的东西放在 externalNativeBuild 。所以如果 CMakeLists.txt 没有修改的话再次同步好像是不会重新执行的。

2K30

【LFS 系列】从零开始 DIY Linux 系统:(五)构建临时系统 - GCC-4.9.2 - 第2遍

GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。 第一次编译 GCC 的时候安装了一些内部系统头文件。...其中的一个 limits.h 会反过来包括对应的系统头文件 limits.h, 在我们的例子,是 /tools/include/limits.h。...但是,第一次编译 gcc 的时候 /tools/include/limits.h 并不存在,因此 GCC 安装的内部头文件只是部分的自包含文件, 并不包括系统头文件的扩展功能。...这足以编译临时 libc,但是这次编译 GCC 要求完整的内部头文件。...4.9.2 使用和正常情况下 GCC 编译系统使用的相同的命令创建一个完整版本的内部头文件: cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname

39710

开篇:预备知识---2

custome1.h 头文件声明的函数 maxx,编译过程中会有什么变化呢?...那么假设我们有一个非常大的程序,其需要链接很多个 .o 文件,那么我们总不能每编译一次就写一次这么长的命令行吧。...GCC 常用编译参数 ​ 我们先简单总结一下GCC 编译 C语言程序的过程:先进行预处理,查找源文件包含(#include)的头文件和其他文件,找到之后进行内容处理和替换,在预处理指令全部处理完成后进行编译...3、将 sub-header 的相对路径 / 绝对路径通过 -I 参数加入 GCC 编译命令,使 GCC 将 sub-header 目录作为头文件搜索目录之一。...关于其他的 GCC 编译参数,可以参考 GCC 使用帮助 make 和 makefile ​ 当我们在编译大型程序的时候,一次性要编译多个文件,此时我们的 GCC 编译命令会很长,所以每一次编译的时候都去写一遍

73920

【技术分享】C语言基础

printf() 函数在 “stdio.h” 头文件声明。 4、stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。...当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。 5、return 0; 语句用于表示退出程序。...下一行 int main() 是函数,程序从这里开始执行。 下一行 /*…*/ 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。...打开命令提示符,进入到保存文件所在的目录。 键入 gcc hello.c,输入回车,编译代码。 如果代码没有错误,命令提示符会跳到下一行,并生成 a.out 可执行文件。...gcc hello.c ./a.out Hello, World! 请确保您的路径已包含 gcc 编译器,并确保在包含源文件 hello.c 的目录运行它。

54410

程序员C语言快速上手——进阶篇(七)

假设现在有小明、小张和小王三人,这三人决定同时开发一个C程序,由小明负责函数的编写和调用,小张编写一个加法函数,小王编写一个减法函数。...1 gcc t1.c t2.c main.c -o main 这里有几点需要注意 头文件和.c源文件放到一个文件夹下 我们自己本地的头文件,在包含时应当写英文双引号,而不是尖括号 有了头文件以后,我们的声明都可以放到头文件...到现在就很容易理解预处理指令#include了吧,就是在正式编译代码之前,帮我们把头文件的声明拷贝到源文件,这说明C语言中,那些声明最终还是必须得写到源文件的。...这件事被称为声明展开 预编译完成之后,接下来需要汇编了,不过我们得先把头文件加回来,重新预编译一次,加了之后,main.i变得很大,这是因为里的声明太多了...1 gcc -c main.s -o main.o 2 gcc -c t1.c -o t1.o 3 gcc -c t2.c -o t2.o 这一次我们生成的.o文件就无法阅读了,已经是二进制文件了,但它还不是可执行文件

1.2K60

Google C++编程风格指南(一)之头文件的相关规范

使用头文件时,我们应该遵守如下几个规范: (1)防止头文件在源文件多次被包含; (2)尽量减少头文件的相互依赖; (3)合理的头文件包含顺序以及名称。...#endif // FOO_BAR_BAZ_H 2.1.2 #pragma once保护 #pragma once是编译指导指令,放在头文件的最开始位置,可以达到和条件宏一样的效果,即当头文件被重复包含时只编译一次...2.2.2柴郡猫技术 减少头文件以来不只有前置申明这一个方法,可以使用柴郡猫技术(Cheshire Cat Idiom),又称为 PIMPL(Pointer to IMPLementation) 、Opaque...对于一个很大的项目,C++一次编译可能就会耗费大量的时间,如果代码需要频繁改动,那真的是不能忍受。...,可只依赖接口头文件,因为接口类是只有纯虚函数的抽象类,没有数据成员[3]^{[3]}。

2.6K10

Makefile学习1

gcc还提供了一些列参数,用来控制编译流程: -E #进行预处理,不作编译 -S #只做汇编处理 -c #进行编译,不链接 -o #指定生成可执行程序名 对于大型项目使用gcc编译的话,每编译一次,都要敲进去几万个源文件...clean: rm -f a.out hello.o Makefile目标依赖 make第一次编译某个项目时,会依次编译所有的源文件。...当一个.c文件包含多个头文件时,如果对应的头文件发生了变化,因为头文件没有包含在依赖关系树,所以这个.c文件就不会重新编译: //hello.c #include #include...gcc -o a.out hello.o module.o 缺点:包含几十个头文件时,把包含的这些头文件都手工添加进去,工作量还是蛮大的。...自动生成头文件依赖关系 更高效的解决方法是:使用gcc -M 命令自动生成头文件依赖关系 通过gcc -M命令,我们就可以自动生成一个hello.o目标文件的依赖关系,就不需要我们手动将头文件添加到规则中了

31110

gcc命令大全

一、gcc的基本用法 使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。...-Idirname:将 dirname 所指出的目录加入到程序头文件目录列表,是在预编译过程中使用的参数。...因此,默认情况下,预编译编译链接一次完成。 编译过程的分步执行:为了更好地理解gcc的工作过程,我们可以让在gcc工作的4个阶段的任何一个阶段停止下来。...如果编译时带上 -Werror 选项,那么 gcc 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。...正因如此,gcc编译时必须有自己的办法来查找所需要的头文件和库文件。常用的方法有: (1) -I 可以向 gcc头文件搜索路径添加新的目录。

1.2K20
领券