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

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

[4]没有c++包含目录和库目录加入相应类包路径 [5]测试工程中被测文件目录可能需要包含被测类cpp定义文件 [6]ICE接口测试时,无法解析可能因为被测文件没有包含进相关cpp文件...为了使编码时编译器不出现错误,我自然需要 * 所使用到声明头文件包含在另一个头文件中!* 这个就是导致错误真正原因!...//A.h #progma once #include“B.h” class A{ int userFile; B b; } 若是只有一两个头文件,这样包含关系或许不会导致错误(这也是我到大二快结束才发现这个错误原因...:以前我习惯是所有类声明放在一个头文件当中。...#include "自己写工具头文件" #include "第三方头文件" #include "平台相关头文件" #include "C++库头文件" #include "C头文件" 小记:这篇博文是我第一篇博文

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

详细剖析 extern C

然后,为了让程序可以工作,你必须将my_handle.o和my_handle_client.o放在一起链接。由于两个目标文件对于同一对象命名不一样,链接器报告相关“符号未定义”错误。...修改my_handle.h代码如下: 小心门未知世界 我们清楚了 extern "C" 来历和用途之后,回到我们本来的话题上,为什么不能把#include 指令放置 extern "C"...即使你比较懒惰,绝大多数情况下,把一个头件自身所有定义和声明都放置extern"C"里面也不会有太大问题。...#endif完全是冗余。 但,C++编译器厂商是如此之多,没有人可以保证某款编译器,或某款编译器早期版本没有__cplusplus值定义为0。...但即便如此,只要能够保证宏__cplusplus只C++编译器中被预先定义 ,那么,仅仅使用#ifdef __cplusplus ⋯ #endif就足以确保意图正确性;额外使用#if __cplusplus

1.2K30

开篇:预备知识---2

比如遇见 #include 指令时将其包含头文件内容插入到该指令所在位置。我们可以通过执行 gcc -E 源文件路径 -o 输出文件路径 指令来对 C语言源文件进行预处理操作。...启动链接指令为:gcc hello.o -o hello.exe。事实上,这也是 GCC 源文件直接编译为可执行文件指令(gcc 源文件 -o 可执行文件输出路径)。 ?...命令为:ar -rcs 生成库文件路径 xx1.o xx2.o xx3.o ...。 我们来试验一下, custom2.h 同级目录下(建议当前创建所有文件都放在同一目录)。.../sub-header/sub-header.h",即使用相对路径 test_header.h 正确路径包含进代码中。...2、 sub-header.h 文件放在 GCC 默认会搜索头文件目录中,Linux 下为 usr/include,Windows 下为 MinGW 安装目录 include 子目录下。

74320

C语言中.h和.c文件解析

:理论上来说C文件与头文件内容,只要是C语言所支持,无论写什么都可以,比如你头文件中写函数体,只要在任何一个C文件包含此头文件就可以这个函数编译成目标文件一部分(编译是以C文件为单位,如果不在任何...假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器按照事先设定路径(Include路径列表及代码文件所在路径...include文件中未找到实现代码,则返回一个编译错误.其实include过程完全可以"看成"是一个文件拼接过程,声明和实现分别写在头文件C文件中,或者二者同时写在头文件中,理论上没有本质区别...而后者已经是数学范畴了,所以说,最难之处还在于掌握清晰概念;   程序设计也是如此,如果概念很清晰,那基本上没什么难题(会难在数学上,比如算法选择、时间空间与效率取舍、稳定与资源平衡上)。...但是如果.c函数也需要调用同个.c其它函数,那么这个.c往往会include同名.h,这样就不需要为声明和调用顺序而发愁了(C语言要求使用之前必须声明,而include同名.h一般会放在.c开头

2.9K40

C语言中.h和.c文件解析(很精彩)

C文件与头文件各写什么内容的话题上:理论上来说C文件与头文件内容,只要是C语言所支持,无论写什么都可以,比如你头文件中写函数体,只要在任何一个C文件包含此头文件就可以这个函数编译成目标文件一部分...假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器按照事先设定路径Include路径列表及代码文件所在路径...include文件中未找到实现代码,则返回一个编译错误.其实include过程完全可以"看成"是一个文件拼接过程,声明和实现分别写在头文件C文件中,或者二者同时写在头文件中,理论上没有本质区别...而后者已经是数学范畴了,所以说,最难之处还在于掌握清晰概念;   程序设计也是如此,如果概念很清晰,那基本上没什么难题(会难在数学上,比如算法选择、时间空间与效率取舍、稳定与资源平衡上)。...但是如果.c函数也需要调用同个.c其它函数,那么这个.c往往会include同名.h,这样就不需要为声明和调用顺序而发愁了(C语言要求使用之前必须声明,而include同名.h一般会放在.c开头

1.5K20

【库函数】Linux下动态库.so和静态库.a生成和使用

main.c:您源文件。 -I/path/to/include:指定要搜索头文件路径。 -L/path/to/lib:指定要搜索库文件路径。 -ltest:指定要链接库文件名称。...main.c:源文件。 -I/root/host/my_program/asoc/include:指定要搜索头文件路径。...2.2.2 动态库错误记录 这个错误动态库执行时候经常会遇到,说找不到这个.so文件,如果放在/lib或者/usr/lib下,那么默认就能找到。...> 修改配置脚本 动态库所在路径加到 /etc/ld.so.conf 文件里 vim /etc/ld.so.conf 添加刷新 /sbin/ldconfig 3....一个头文件: vi staticlib.h 头文件接口实现三个c文件:staticlib.c 我们这几个文件编译成一个静态库:libstatic.a 3.1.1 文件详情 我路径/root/host

34710

面向 C++ 现代 CMake 教程(二)

我们头文件放在include目录中——这些文件被.cpp实现文件用来声明来自其他 C++翻译单元符号。...它还会忽略空字符串,所以即使写如下内容也是可以: target_compile_definitions(hello PRIVATE -D FOO) -D是一个独立参数;移除它将变成一个空字符串,然后正确地被忽略...使用统一构建时,你还需要考虑一些可能不是那么明显捕捉到 C++语义含义——匿名命名空间跨文件隐藏符号现在被分组到一组中。静态全局变量、函数和宏定义也是如此。...预处理器输出对于发现诸如不正确include 路径(提供错误版本库)以及导致错误#ifdef评估定义错误等 bug 很有帮助。 语言分析阶段输出对于针对特定处理器和解决关键优化问题很有用。.../usr/include/c++/9/ostream object file名称之后,输出中每一行都包含一个头文件路径。行首一个点表示顶级包含(#include指令hello.cpp中)。

21900

Java底层-本地接口(JNI)

文件生成一个头文件(.h后缀文件),这种转换会将native方法抽离到头文件中,我们可以认为头文件很像一个接口,Java可以通过头文件来调用资源库程序,一些特殊场合下,C/C++源代码如果不便(...,我们我们就需要编写它实现,首先定义.cpp文件(可以使用C++开发工具或者纯文本编写也是可以), cpp文件中首先引入我们生成头文件,引入头文件之后,我们就对上面头文件方法 JNIEXPORT...有C++环境之后,编译过程中可能会出现下面报错, 'jni.h' file not found 这是因为我们引入jni.h找不到,我们可以jdk路径include复制出来,和上面编译文件同级...-I选项,是因为我们用到相关头文件放在/include目录下。...(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件声明不一致,编译器就会指出错误,这一简单规则能大大减轻程序员调试、改错负担。

1.1K10

C ++ 中不容忽视 25 个 API 错误设计!

错误#9:使用隐式模板实例化时,使用模板实现细节来混淆公共头文件 隐式实例化中,模板代码内部必须放在头文件中。没有其他办法。...即使我们内部发现/IP一般问题放在一边,客户端也可能以非预期方式使用API,使用他们系统,然后致电你支持团队,以解决他们最初不以非预期方式使用API而造成问题。 那是他们错吗?不!...错误#14:不避免不必要include头文件 为什么这是一个错误? 不必要头文件可以明显增加编译时间。...这通常是因为另一个include头文件未编译头文件之前在编译链中,并且为这个未编译头文件提供了缺失功能。...利用testMain.cpp通过隔离编译方式来检查头文件内容,testMain.cpp除了包含测试头文件之外什么也没有。如果它产生编译错误,那么需要将某些内容include头文件中或向前声明。

1.5K20

Google C++ 编程风格指南:头文件

通常每一个 .cc 文件都有一个对应 .h 文件. 也有一些常见例外, 如单元测试代码和只包含 main() 函数 .cc 文件. 正确使用头文件可令代码可读性、文件大小和性能上大为改观....#include 路径及顺序 使用标准头文件包含顺序可增强可读性, 避免隐藏依赖: 相关头文件, C 库, C++ 库, 其他库 .h, 本项目内 .h....虽然方便却易混乱, 使用比较完整项目路径看上去很清晰, 很条理, 包含文件次序除了美观之外, 最重要是可以减少隐藏依赖, 使每个头文件 “最需要编译” (对应源文件处 : D) 地方编译, 有人提出库文件放在最后..., 这样出错先是项目内文件, 头文件放在对应源文件最前面, 这一点足以保证内部错误及时发现了.... #include 中插入空行以分割相关头文件, C 库, C++ 库, 其他库 .h 和本项目内 .h 是个好习惯。

70630

C++类设计与实现规范

1.规范一:定义放在头文件中实现 这样可以保证通过引入头文件时,使用是同一个类,也有利于代码维护。...有没有一劳永逸做法,其实是有的,我们定义放在头文件中,需要类源文件包含类定义所在头文件即可,保证了类定义一致性,并且修改效率高,代码易于维护。...产生这个错误原因是Student类涉及存在缺陷,数据成员id和name访问权限设置为public,意味着有无数函数可以不加限制地访问学生对象数据成员,这样就无法保证每次对数据成员设置是正确...(1)类成员函数定义内部影响可读性。一般来说,类定义放在头文件中,使用时被不同源文件包含,如果类成员函数定义类体内,将会是代码体积增大,影响阅读,不利于类修改与维护。...如果类成员函数放在类外定义,则编译器可以发现这种重定义错误,所以实现中,应该类成员函数尽可能地放在类外定义,如果要定义内联函数,只需要在成员函数定义时显示地使用inline关键字即可。

1.2K22

手把手教你写一个 Makefile 文件

对于后者,通常是你需要告诉编译器头文件所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。...链接程序时,链接器会在所有的Object File中找寻函数实现,如果找不到,那就会报链接错误码(Linker Error),VC下,这种错误一般是:Link 2001错误,意思是说,链接器未能找到函数实现...文件绝对路径,只保留文件名 引入函数Makefile版本可以改写成: TARGET = main SOURCE = $(wildcard *.c) OBJS = $(patsubst %.c,...,我们就会对文件按照文件类型进行分类,分为头文件、源文件、目标文件和可执行文件,分别放在不同目录中,由Makefile统一管理这些文件,生产目标文件放在目标目录下,可执行文件放到可执行目录下,分类目录如下图...,最后执行main结果也是和前面基础版Makefile结果是一样

1.5K10

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

试想一下,多人开发之前,大家只要协商好头文件,后面就只需要对照着头文件去写代码,省了很多事。开发完成源代码编译,这时候头文件就相当于一份功能说明书,可以很方便二进制和头文件一同发布。...关于头文件总结 以上例子是演示完了,但细心朋友会发现,这里还遗留了一些问题。 头文件到底是什么? 头文件一定要和源代码放在一起吗? 包含头文件时,和""到底有什么区别?...当我们想将头文件C语言源文件放在同一根路径下时,为了方便查看,可以单独为头文件再创建一个目录,例如创建一个head目录,头文件移入,则需要使用相对路径包含写法#include "head/calculate.h...当我们头文件和源文件同一级目录时,这时候头文件路径是以源文件(.c文件)路径为参照物,因此当使用双引号来包含;当我们头文件和源文件不在同一级目录下时,且使用上述两种方式之一指定了头文件路径,那么使用...关于宏一些总结 使用宏函数,可以减少函数栈调用,稍微提升一点性能,相当于C++中内联概念,C99中也实现了内联函数新特性。缺点是宏展开,增加了编译体积大小。

1.2K60

Linux之动态库和静态库

编译器搜索头文件,默认是在当前目录下搜索,系统默认指定路径下搜索。虽然此时mylib在当前路径下,但是头文件太深了(文件不在本层),编译器找不到头文件,因此我们需要给gcc指定路径(-I)。...,也就是说,一定要告知是哪一个路径哪一个库,即使路径下只有一个库也要明确告知gcc是哪一个库(我们以前写代码时候,从未指明库名称,是因为gcc/g++默认帮我们填写了,因为它们可以识别C/C+...库安装 库安装到系统头文件下。...gcc对头文件默认路径为/usr.include,对于库文件默认路径是/lib64 sudo cp 头文件(包含路径) /usr/include/ sudo cp 库文件(包含路径) /lib64/...本文作者目前也是正在学习Linux相关知识,如果文章中内容有错误或者不严谨部分,欢迎大家评论区指出,也欢迎大家评论区提问、交流。

35220

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

Oboe 源码放在应用中编译 ; 下载最新发布版本 Oboe 源代码 , 下载地址 https://github.com/google/oboe/releases/ ; 将其放在指定目录中 , 并记录该目录路径...; 推荐源码放在 cpp 源码路径下 ; 编辑 CMakeLists.txt 构建脚本 : ① 设置 Oboe 源代码路径 : 这里 假设 Oboe 源代码 CMakeLists.txt 构建脚本相同层级目录中.../oboe) ② Oboe 源码目录设置为工程路径 : add_subdirectory 告诉 CMake 到 OBOE_DIR 路径中查找该路径 CMakeLists.txt 构建脚本 ,.../oboe) ③ 指定 Oboe 源码头文件路径 : 允许本次 CMake 编译目标库中可以包含 Oboe 源码头文件 , 进而访问 Oboe API ; include_directories (...指定 Oboe 源码头文件路径 # 允许本次 CMake 编译目标库中可以包含 Oboe 源码头文件 , 进而访问 Oboe API include_directories (${OBOE_DIR

95900

面向 C++ 现代 CMake 教程(四)

编写高质量代码并非易事,即使对于经验非常丰富开发者也是如此。...明智开发者知道,在要求不高环境中遵循类似实践并不会有什么坏处,尤其是采用成本如此之低情况下。构建过程中使用静态分析器不仅比手动查找和修复错误便宜得多;而且通过 CMake 很容易启用。...可能出现各种错误:读取未分配内存、读取已经释放内存、尝试多次释放内存以及写入错误地址。开发者显然试图避免这些错误,但由于这些错误如此微妙,它们甚至可以潜入最简单程序中。...理想情况下,我们希望能够这些公共头文件放在一个能表明它们来源并引入命名空间目录中;例如,/usr/local/include/calc。...建议配置文件中使用它,以便尽早发现错误路径

24800

【答疑解惑】头文件使用过程中需要注意几个点

头文件c/c++程序十分常见,java 中换成了import。我们经常用到它,正因为如此,一些细节东西容易被忽略。...C语言,使用include指令,包含头文件,但又细分两种形式: 1、#include “file1.h” gcc先在当前目录(指包含本条#include指令源文件所在目录)寻找file1.h,如果找不到...,继续由-iquote选项(如果有的话)指定目录中寻找file1.h。...值得一提是,放在/usr/local/include/下头文件也会被gcc自动检索. 3、#include “file3.c” 这种使用也是可以用法与1类似。...头文件引用是一个比较复杂过程,头文件中应用其他头问文件等等。如果使用不好会导致编译错误摸不着头脑。一定要注意。

63890

【Linux】软硬链接与动静态库

当然,假如此时我们源文件路径给更改,并不会发生什么影响,但是假如我们源文件给删除。我们会发现,那个数字就会由2变成1,但依然可以运行。 接下来我们看一个现象:为什么目录文件硬链接数为2?  ...是因为我们包含了各自对应头文件,而头文件内容包含了该函数声明,具体实现方法则在库文件中,链接阶段,我们经过编译.o文件会与库文件进行合并,最终形成可执行程序。...库存在就是为了提高开发效率,举个例子,假如没有c/c++标准库,我们写代码时就要手动printf、cout等高频函数实现方法进行编写,这样就大大减少了我们开发效率。...对于静态库使用,还有第二种方法如下: 第二种方式使用静态库:头文件以及库文件安装在系统目录 由于gcc/g++在编译时,会默认去系统目录搜索,进行路径匹配,这也是为什么我们平常用c/c++标准库时,...库所在系统路径:/lib64 头文件所在系统路径:/usr/include  这里需要注意是,一般我们不要轻易修改系统环境,因此我们用完要手动删除,否则会一直存在。

18130
领券