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

C++:无法解析的外部符号问题 头文件包含注意要点

个人认为:出现这种情况的概率十分之小)于是我将文件发送到我的台式电脑,再次尝试编译,果不其然,依旧出现相同的错误提示! 问题究竟出在哪?我想着问题范围应该就在于头文件了。...方法二是类的声明中必须得用到其他类或者函数时,方法一便不再适用,一个类声明中引用的是其他类或结构的指针引用或者是函数引用时,也可以保持上 述原则,做法是采用前向引用,及在该类的声明前面先声明一下该类所用到的类名或者函数名就行...类声明中引用的是其他类的实例时,上述原则变不能保持,只 有在该类的声明头文件中引用所引用的类或者函数头文件。...为了使编码时编译器不出现错误,我自然需要 * 将所使用到的类的声明头文件包含在另一个头文件中!* 这个就是导致错误的真正原因!...这个做法不可取),但是一旦头文件较多,复杂的包含关系就会导致编译器没编译部分头文件或无法找到头文件相关的cpp文件(这一点我并非十分确定)。

3.6K21

Component之C++

首先,VxWorks支持C++编程,毕竟面向对象语言功能强大。不过因为性能的原因,在实时系统里,更多的还是使用C语言编程。...中的C++组件有 INCLUDE_CTORS_DTORS - 默认包含,确保内核启动时调用编译器生成的初始化函数(包含C++静态对象的初始化) INCLUDE_CPLUS - C++应用的基本支持,通常...INCLUDE_CPLUS_LANG一起使用 INCLUDE_CPLUS_LANG - C++语言特性的支持,例如new、delete、异常处理等 INCLUDE_CPLUS_IOSTREAMS - 包含所有类功能...当然也包括它俩的C++系统libcplus.a ? 另外,它俩的头文件也不相同,而且各自使用自己的路径,而不是系统的target/h ? ?...为了解决这个问题,C++的符号需要使用extern "C"声明 看个例子 ? 在头文件中,使用宏__cplusplus声明函数,这样C++和C文件都可以引用它 C++函数如下 ? C函数如下 ?

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

C和C++混合编译,extern和extern C

首先看一下C++对类似C的函数是怎样编译的:    作为面向对象的语言,C++为了支持函数重载,函数在被C++编译后在符号中的名字C语言的不同。...假如某个函数的原型为void foo(int x, int y);该函数被C编译编译后在符号中的名字为_foo,而C++编译器则会产生_foo_int_int之类的名字。...被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话概括extern “C”的真实目的:实现C++C的混合编程。...也就是说extern有两个作用,第一个,它与"C"一起用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是...第二,extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用

3.3K11

CC++面试常问题集(1)

前者是从标准路径寻找,后者是从当前工作路径 包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号()。...另外开发人员也可以定义自己的头文件,这些文件一般c源程序放在同一目录下,此时在#include中要用双引号('')。 3、C/C++文件编译执行的四个阶段?...(3)头文件包含指令,如#include 'FileName'或者#include 等。  采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。...使用动态链接能够使最终的可执行文件比较短小,并且共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。...主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用实现,首先入栈的是主函数下一条指令的地址,即扩展指针寄存器的内存(eip),然后是当前栈的底部地址,即扩展基址指针寄存器内容(ebp

70040

CMake简易指南

目标编译系统cmake Google GN类似,属于meta-build(源编译)系统,有自己的交互语法,使用时需要先将自身的语法翻译成其他编译系统,这个翻译过程称之为configure(配置),在执行配置命令时可以通过...,CMAKE_SYSTEM_NAME CMAKE_HOST_SYSTEM_NAME 是不同的,正因为编译环境运行环境不同,所以才叫 交叉编译变量以及内置变量为了便于阅读和维护,通常会使用变量保存一些内容...表达式支持很多条件,具体参考 cmake-generator-expressions,灵活运用表达式可以让 cmake避免一堆长长的if/else,使代码变得非常清晰简洁交叉编译工具链交叉编译的本质是使用指定的编译编译生成指定处理器平台的中间文件...工具链通常用于指定系统名称、目标处理器类型、编译器、搜索路径以及编译参数等信息,使用时在 cmake 配置阶段使用变量 CMAKE_TOOLCHAIN_FILE 指定,如:cmake .....ExternalProject_Add 也可以直接用于下载源代码,以源码形式添加到项目中一起编译,具体根据项目需要选择使用方式。

67850

PCL中的C++特性

那我们知道cpp是C++工程中函数实现的代码,以下是根据PCL中的代码中常用的C++特征。...基本介绍请查看文章:点云及PCL编程基础 .h和.hpp文件的区别 *.h类似,hpp是C++程序头文件,其实质是将cpp中的实现代码放在.hpp文件中,定义实现都包含在同一个文件中,在使用的时候只需要...该文件具有的特点: .hpp.h文件类似,hpp也是C++程序的头文件。 是一般模板类的头文件 一般来说。....inline的使用时有所限制的,inline只适合函数体内部代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数...这是因为C++编译中函数名会变得很长,C生成的不一致,造成C++不能直接调用C函数。

1.1K30

C++C++入门(一)

前言 C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的,以及编程范式等。为学习C++类和对象打下基础。 2....std是所有C++的命名空间 指定代码中没有std时就报错了。 把命名空间打开,就能直接用,不用指定命名空间了。 3.2 命名空间的使用 命名空间中成员该如何使用呢?...注意:早期标准将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器...因为C++兼容C语言的用法,这些又用得不是很多。 std命名空间的使用惯例: std是C++标准的命名空间,如何展开std使用更合理呢?...所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的对象/类型等方式。 之后会继续分享C++有关内容,大家多多关注。

11010

C++】输入&输出、缺省参数、函数重载

实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识, 可以发现C++头文件的后缀中不含.h,这是C不同的地方: 早期标准将所有功能在全局域中实现...,声明在.h后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持格式,后续编译器已不支持,因此推荐使用+std的方式 std命名空间的使用惯例: std是C++标准的命名空间,如何展开std使用更合理呢?...using namespace std展开,标准就全部暴露出来了,如果我们定义跟重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。...所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +using std::cout展开常用的对象/类型等方式。

13510

学习PCL你应该知道的C++特性

那我们知道cpp是C++工程中函数实现的代码,以下是根据PCL中的代码中常用的C++特征。...基本介绍请查看文章:点云及PCL编程基础 .h和.hpp文件的区别 *.h类似,hpp是C++程序头文件,其实质是将cpp中的实现代码放在.hpp文件中,定义实现都包含在同一个文件中,在使用的时候只需要...该文件具有的特点: .hpp.h文件类似,hpp也是C++程序的头文件。 是一般模板类的头文件 一般来说。....inline的使用时有所限制的,inline只适合函数体内部代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数...这是因为C++编译中函数名会变得很长,C生成的不一致,造成C++不能直接调用C函数。

1.1K20

CC++程序的编译过程

C/C++语言的编译链接过程要把我们编写的一个c/c++程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。 编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。...在头文件中一般用伪指令# define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。 采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。...在程序中# include它们要使用尖括号()。另外开发人员也可以定义自己的头文件,这些文件一般c源程序放在同一目录下,此时在# include中要用双引号("")。...第一种是链接程序可把它与其它可重定位文件及共享的目标文件一起处理创建另一个目标文件; 第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。...使用动态链接能够使最终的可执行文件比较短小,并且共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。

62530

Python 的 .py Cython 的 .pxd .pyx .pyd 文件格式之间的主要区别

Cython 是编写、包裹外部 C/C++ 的胶水代码,将 CPython 嵌入现有应用程序、加速 Python 代码执行的理想 C 模块语言。....pxd 文件类似于 C 语言的 .h 头文件,.pxd 文件中有 Cython 模块要包含的 Cython 声明 (或代码段)。.pxd 文件可共享外部 C 语言声明,也能包含 C 编译器内联函数。....pxd 文件还可为 .pyx 文件模块提供 Cython 接口,以便其它 Cython 模块可使用比 Python 更高效的协议之进行通信。...在 python 中使用时,把它当成 module 来用就可以了,即:"import 路径名.modulename" 即可,路径名为 .pyd 文件所在的路径。...D 语言源自 C/C++,借鉴了众多编程语言的特色和现代编译器技术,融会贯通了设计者丰富的实践经验,使之具备了非凡的威力 ── 既有 C/C++ 语言的强大威力,又有 Python 和 Ruby 的开发效率

5K30

蓝桥ROS机器人之C++基础2总结和测评

函数参数是函数中使用的变量,其值由函数的调用者提供。参数是从调用者传递给函数的特定值。一个参数被复制到参数中时,这称为按值传递。 C++ 没有定义函数调用是否从左到右评估参数,反之亦然。...一个变量可以被访问时,我们说它在范围内。它无法访问时,我们说它超出了范围。Scope 是一个编译时属性,这意味着它在编译时强制执行。 重构是将一个较大的函数分解为许多更小、更简单的函数的过程。...预处理器是在代码编译之前在代码上运行的进程。指令是预处理器的特殊指令。指令以 # 符号开头并以换行符结尾。宏是定义如何将输入文本转换为替换输出文本的规则。 头文件是旨在将声明传播到代码文件的文件。...在包含头文件时,在包含系统头文件(例如 C++ 标准中的头文件)时使用尖括号,在包含用户定义的头文件(您编写的头文件)时使用双引号。包含系统头文件时,如果存在不带 .h 扩展名的版本,请包含它们。...应该使用 main() 函数将上述函数粘合在一起。 提示:不需要编写单独的函数来进行添加(直接使用 + 即可)。 提示:需要调用 readNumber() 两次。

73140

C++从入门到精通——C++输入和输出

I/O流是计算机程序中常用的数据输入输出方式,它提供了灵活和高效的读写操作,使程序能够外部设备进行有效的数据交互。...实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些我将在后续文章讲解 注意:早期标准将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可...,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持格式,后续编译器已不支持,因此推荐使用<iostream...错误处理:printf和scanf的错误处理相对简单,它们返回一个错误代码指示是否成功。而cout和cin则使用C++的异常机制来处理错误。...所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的对象/类型等方式。

22210

jni和ndk详解

NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++头文件文件、说明文档和示例 代码,我们可以理解为Windows Platform SDK...还有一个我个人理解,NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件,比如utils/Log.h 而后者的资源更多,当然NDK正在努力开发中,以便支持更丰富的接口...NDK提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态,并能自动将 so 和 java 应用一起打包成 apk 。这些工具对开发者的帮助是巨大的。...NDK可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作。 2、NDK 提供了一份稳定、功能有限的API头文件声明。...问:NDK带来什么 1、NDK 的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。 使用NDK ,我们可以将要求高性能的应用逻辑使用 C 开发,从而提高应用程序的执行效率。

98490

Google C++ 编程风格指南(二):作用域

头文件使用匿名空间导致违背 C++ 的唯一定义原则 (One Definition Rule (ODR)). 结论: 根据下文将要提到的策略合理使用命名空间. 2.1.1....声明标准下的实体, 需要包含对应的头文件....定义在同一编译单元的函数, 被其他编译单元直接调用可能会引入不必要的耦合和链接时依赖; 静态成员函数对此尤其敏感. 可以考虑提取到新类中, 或者将函数置于独立的名字空间内....C++ 允许在函数的任何位置声明变量. 我们提倡在尽可能小的作用域中声明变量, 离第一次使用越近越好. 这使得代码浏览者更容易定位变量声明的位置, 了解变量的类型和初始值....同理,全局和静态变量在程序中断时会被析构,无论所谓中断是从 main() 返回还是对 exit() 的调用。析构顺序正好构造函数调用的顺序相反。但既然构造顺序未定义,那么析构顺序当然也就不定了。

73930

C++心决之命名空间、重载函数和引用

注意:早期标准将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,...规定 C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 格式,后续编译器已不支持 #include using namespace std...: std 是 C++ 标准的命名空间,如何展开 std 使用更合理呢?...所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 + using std::cout 展开常用的对象 / 类型等方式。 4....而 C++ 是通过函数修 饰规则区分,只要参数不同,修饰出来的名字就不一样,就支持了重载 。 7.

9210

C++内联函数

在C语言中,我们使用宏定义函数这种借助编译器的优化技术减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数。...内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。...C++内联函数提供了替代函数调用的方案,通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。...缺点: 因为代码的扩展,内联函数增大了可执行程序的体积。 C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。...编译器的内联看起来就像是代码的复制粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间代码,将为程序的调试带来困难。

56920

低级工具——C语言C++

条件编译指令 条件编译指令有#ifdef,#ifndef,#elif,#else,#endif这些指令是用来对编译代码进行筛选的,在自己编写头文件时,大家都会写上这么几行代码(注意看前两行和最后一行)...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言用的是VC6.0,头文件包含用双引号准没错,但是如果你使用了VS2017,那就不是这样了...第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。...这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接实际上是一个目标文件的集合,其中的每个文件含有中的一个或者一组相关函数的代码。...使用动态链接能够使最终的可执行文件比较短小,并且共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。

2.1K10

Python遇见C++碰出的编译火花

为了让大家更好的对“引擎”进行调整,懂得低级工具的使用过程是很有必要的! C语言/C++运行的过程分为三步:编译,链接,运行。编译的过程又分为以下几步:编译预处理,编译程序本身,优化程序,汇编程序。...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言用的是VC6.0,头文件包含用双引号准没错,但是如果你使用了VS2017,那就不是这样了...第一种事链接程序可把它与其它可重定位文件及共享的目标文件一起处理创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。...这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接实际上是一个目标文件的集合,其中的每个文件含有中的一个或者一组相关函数的代码。...使用动态链接能够使最终的可执行文件比较短小,并且共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。

96010

C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

错题解析:函数和变量被C++编译后在符号中的名字C语言的不同,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。...使用时会对编译器有什么暗示。...正确答案: 函数和变量被C++编译后在符号中的名字C语言的不同,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。...正确答案: 前者用来包含开发环境提供的头文件,后者用来包含自己编写的头文件。 9、C函数可否单独编译?...9、头文件的作用是什么? 正确答案: 1)通过头文件调用功能。 2)头文件能加强类型安全检查。 10、请问运行Test函数会有什么样的结果?

1.7K20
领券