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

为什么在make文件中可以链接.cc文件而不能链接.c文件?

在make文件中可以链接.cc文件而不能链接.c文件的原因是因为.cc文件是C++源文件,而.c文件是C源文件。C++是C的超集,C++编译器可以编译C代码,但C编译器无法编译C++代码。

C++相对于C语言具有更多的特性和功能,例如类、对象、继承、多态等。因此,C++编译器在编译C++源文件时会对代码进行更复杂的处理和优化。

在链接阶段,编译器会将源文件编译成目标文件,然后链接器将这些目标文件合并成最终的可执行文件。链接器需要根据目标文件中的符号表信息来解析函数和变量的引用关系。C++编译器会对C++源文件进行名称修饰(name mangling),以支持函数重载和命名空间等特性。而C编译器不会进行名称修饰。

因此,在make文件中可以链接.cc文件而不能链接.c文件,是因为链接器需要根据编译器生成的目标文件中的符号表信息来解析函数和变量的引用关系,而C++编译器会对C++源文件进行更复杂的处理和优化,包括名称修饰,而C编译器不会进行这些处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通过ffinode.js调用动态链接库(.so.dll文件)

本文作者:IMWeb link 原文出处:IMWeb社区 未经同意,禁止转载 概述 为什么要在node.js调用动态链接库 由于腾讯体系下的许多公共的后台服务(L5, CKV, msgQ等...ffi只能调用C风格的模块。 需要将C源码build成动态链接库以供调用,Linux下将C源码build成.so文件windows下build成.dll文件。...煎蛋栗子 这里就不演示利用node-gyp将.cc文件生成.node文件了,一般我都是找后台同学帮我把C源码文件编译成.so文件,然后直接拿过来用!哈哈哈!...,使用ffi调用C接口传参时,C的char *类型nodejs源码可以直接用string类型表示,而对于nodejs没有的int类型,我们也可以直接写成int。...由于javascript和C这两种语言的基本类型并不能完全对齐,所以有时候调用的时候,对于传参出参的处理比较麻烦。经常遇到的一个问题就是如何在JS针对C的指针类型进行操作。

5.6K10

通过ffinode.js调用动态链接库(.so.dll文件)

概述 为什么要在node.js调用动态链接库 由于腾讯体系下的许多公共的后台服务(L5, CKV, msgQ等)已经有了非常成熟的C/C++编写的API,以供应用程序调用,node.js作为公司内新兴的后台...ffi只能调用C风格的模块。 需要将C源码build成动态链接库以供调用,Linux下将C源码build成.so文件windows下build成.dll文件。...煎蛋栗子 这里就不演示利用node-gyp将.cc文件生成.node文件了,一般我都是找后台同学帮我把C源码文件编译成.so文件,然后直接拿过来用!哈哈哈!...,使用ffi调用C接口传参时,C的char *类型nodejs源码可以直接用string类型表示,而对于nodejs没有的int类型,我们也可以直接写成int。...由于javascript和C这两种语言的基本类型并不能完全对齐,所以有时候调用的时候,对于传参出参的处理比较麻烦。经常遇到的一个问题就是如何在JS针对C的指针类型进行操作。

5.9K70

通过ffiNode.js调用动态链接库(.so.dll文件)

作者:link [img594ca61c8d41d.jpg] 概述 为什么要在node.js调用动态链接库 由于腾讯体系下的许多公共的后台服务(L5, CKV, msgQ等)已经有了非常成熟的C...ffi只能调用C风格的模块。 需要将C源码build成动态链接库以供调用,Linux下将C源码build成.so文件windows下build成.dll文件。...煎蛋栗子 这里就不演示利用node-gyp将.cc文件生成.node文件了,一般我都是找后台同学帮我把C源码文件编译成.so文件,然后直接拿过来用!哈哈哈!...,使用ffi调用C接口传参时,C的char *类型nodejs源码可以直接用string类型表示,而对于nodejs没有的int类型,我们也可以直接写成int。...由于javascript和C这两种语言的基本类型并不能完全对齐,所以有时候调用的时候,对于传参出参的处理比较麻烦。经常遇到的一个问题就是如何在JS针对C的指针类型进行操作。

5.9K02

Makefile教程

${DIR_OBJ}/%.o:%.cpp $(CC) $(CFLAGS) -c $< -o $@ ${INCDIR} 此外,通过g++编译生成动态链接库或静态链接库,可以参考linux: 几个常用...对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为作为变量不是整个字符串($PATHMakefile实际上是$(P)ATH)。...再如: $(filter %.c ,SOURCES) 此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,%.c即为此过滤器规则。...为什么使用PHONY来指明命令名称: (1)避免和同名文件冲突。其实是可以不用.PHONY来指明命令名称,因为命令并不会被产生,也就是不存在,所以make target时命令始终会被执行。...: $(CC) $(INCLUDE) $(CFLAGS) -c $< 一眼望去,为什么目Makefile目标文件没有依赖项。

3.9K53

换个角度说Makefile

我们通常使用gcc就可以编译得到想要的程序了: $ gcc -o main main.c -lm (如果不理解为什么要加-lm,请参考《一个奇怪的链接问题》)。...然而到这里又会想,既然编译链接都是这么类似的过程,能不能给它们写一些通用的规则,搞得这么复杂干嘛?然后按照规则去执行就好了。 makefile就是这样的一个规则文件make是规则的解释执行者。...执行下面的命令后: $ make clean rm pow.c 你就会发现pow.c被删除了。 如果当前目录有clean文件会发生什么?...这个《helo程序是如何编程可执行文件的》已经有所介绍,还不了解的朋友可以简单了解一下。那么放到makefile具体要做什么呢?...如果要清除这些目标文件,那么可以执行make clean: $ make clean rm main.o main $ ls main.c makefile 总结 本文主要介绍了两部分内容。

73220

makefile终极奥义

只要我们的 Makefile 写得够好,所有的这一切,我们只用一个 make 命令就可以完成,make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件链接目标程序...mult.o div.o add.o main.o -o app 思考:为什么写这么复杂,先生成.o再生成.c 直接说答案:「方便编译链接」 小实验:修改add.c里面的内容,随便按一个空格,然后保存退出再执行...你可以在你的makefile改变这些变量的值,或是make的命令行传入这些值,或是在你的环境变量设置这些值 命令的变量 变量 默认命令 意义 AR 默认命令是 ar 函数库打包程序。...匹配一个字符 * 所有 GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令 例如: 只要make看到一个 .o 文件,它就会自动的把 .c 文件加在依赖关系,如果make找到一个...函数 Makefile可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。

1.3K30

6_Makefile与GCC

6.3.1 动态链接库和静态链接库使用例程 ​ 静态库和动态库,是根据链接时期的不同来划分。 ​ 静态库:链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。...动态库刚好弥补了这个缺陷,因为动态库是程序运行时被链接的,所以磁盘上只需保留一份副本,一次节约了空间,如果发现bug或者是要升级,只要用新的库把原来的替换掉就可以了。 ​...2)CFLAGS:编译的时候使用的参数,-Wall -g -c ​ 3)LDFLAGS:链接库使用的选项,-L -l ​ 其中:默认值可以被修改,比如CC默认值是cc,但可以修改为gcc:CC=gcc...为什么clean下的命令没有被执行?这是因为Makefile定义的只执行命令的目标与工作目录下的实际文件出现名字冲突。...Makefileclean目标没有任何依赖文件,所以目标被认为是最新的不去执行规则所定义的命令。所以rm命令不会被执行。

3.5K10

Linux里Makefile是什么?它是如何工作的?

当你需要在一些源文件改变后运行或更新一个任务时,通常会用到 make 工具。make 工具需要读取一个 Makefile(或 makefile)文件文件定义了一系列需要执行的任务。...这就是为什么很多 Makefile 会包括 all 这个目标,这样可以调用多个目标。...PHONY 用来定义这些不是文件的目标。make 会默认调用这些伪目标下的步骤,不去检查文件名是否存在或最后修改日期。...本示例,所有 “.c”后缀的文件会被存入 SRCS 变量。 BINS := (SRCS:%.c=%):这被称为替代引用。...下面是展开后的内容: foo.o: foo.c @echo "Creating object.." gcc -c foo.c 最后, clean 目标,所有的二进制文件和编译文件将被删除。

3.3K31

操作系统(5)实验0——makefile的写法

前提与假设 这里假设使用的make是GNU的make(不同厂商的make对应的makefile写法不一样,make可以理解为根据makefile来编译链接程序的工具)。...上面指令就是指定输出结果名字为hellomake,编译两个*.c文件-I用来高数gcc同一个目录下寻找用到的链接文件(.h头文件),其实这个选项还可以指定gcc去别的目录下寻找别的库,详情可以看这里...,这是指定在当前目录搜索链接库的意思。 但是这只是写小工程的时候才可以这么干,如果你要编译一个有20+个.c文件链接需要30+个库的工程呢?...makefile恰好就有这个功能,你只需要将这个指令直接输入到makefile直接用到的时候直接使用指令make,工具make就会直接帮你运行makefile的这个命令。...既然提到了规则,那么就介绍下makefile的规则写法: 规则,如果是第一次执行规则或者执行规则对应的prerequisites文件被更新了,那么执行规则的时候才会运行规则对应的command

1.7K20

跟我一起写Makefile:MakeFile介绍

这个示例来源于gnu的make使用手册,在这个示例,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。...我们可以把这个内容保存在名字为“makefile”或“Makefile” 的文件,然后该目录下直接输入命令“make”就可以生成执行文件edit。...如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。...include的语法是: include ; filename可以是当前操作系统Shell的文件模式(可以包含路径和通配符) include前面可以有一些空字符,但是绝不能是[Tab...如果你想让make不理那些无法读取的文件继续执行,你可以include前加一个减号“-”。

97620

跟我一起写Makefile

这个示例来源于gnu的make使用手册,在这个示例,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。...我们可以把这个内容保存在名字为“makefile”或“Makefile” 的文件,然后该目录下直接输入命令“make”就可以生成执行文件edit。...如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。...include的语法是: include ; filename可以是当前操作系统Shell的文件模式(可以包含路径和通配符) include前面可以有一些空字符,但是绝不能是[...如果你想让make不理那些无法读取的文件继续执行,你可以include前加一个减号“-”。

1K70

程序员C语言快速上手——工程篇(十三)

既然可以通过命令行脚本(shell)完成编译工作,为什么还需要Makefile脚本文件呢?...目标顶格写,command前面则必须有一个制表符(即Tab键) 要想写Makefile文件,必须对C语言的编译链接阶段有基本的了解,总的来说,就是将.c源码文件编译为.o目标文件,然后将.o文件链接为可执行程序...clean: rm *.o main.exe make工具,它能够自动完成对.c文件的编译并生成对应的.o文件。...但是要注意,我们如果在Windows上执行以上简化版的make,则会报错,这是因为Linux系统cc命令会默认的链接到gcc命令上,执行cc命令就是执行gcc命令,而我们Windows系统是没有...伪目标伪目标就是一个标签,它本身既不是目标文件也不是可执行文件,例如上面例子的clean,我们可以通过伪目标定义一些命令,然后make中去执行。

2.9K30

跟我一起写 Makefile(一)

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件应该只是声明,而定义应该放在C/C++文件),只要所有的语法正确,编译器就可以编译出中间目标文件。...而在链接程序时,链接器会在所有的Object File找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现...这个示例来源于GNU的make使用手册,在这个示例,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。...我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件,然后该目录下直接输入命令“make”就可以生成执行文件edit。...要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以一个makefile定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

25910

快速上手和使用makefile

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件应该只是声明,而定义应该放在C/C++文件),只要所有的语法正确,编译器就可以编译出中间目标文件。...一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。...而在链接程序时,链接器会在所有的Object File找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现.... ; } 现在就可以用GCC来编译和链接文件了。...更近一步,可以把这些命令写入文件,命令为makefile,直接make一下就可自动完成编译链接和生成执行文件

1.3K20

CC++之makefile写法

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件应该只是声明,而定义应该放在C/C++文件),只要所有的语法正确,编译器就可以编译出中间目标文件。...一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。...而在链接程序时,链接器会在所有的Object File找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现...找寻的过程,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。...它们分别告诉了make我们要使用的编译器、要编译的目标以及源文件。这样一来,今后我们要修改这三者的任何一项,只需要修改常量的定义即可,不用再去管后面的代码部分了。

72620

跟我一起写 Makefile(二)

找寻的过程,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。...如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。...所以,为了makefile的易维护,makefile我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。...五、让make自动推导 GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。...六、另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易

20830

全网最牛Linux内核Makefile系统文件详解(纯文字代码)

一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ 文件)来链接我们的应用程序。...这个示例来源于GNU的make使用手册,在这个示例,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。...include的语法是: include filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符) include 前面可以有一些空字符,但是绝不能是[Tab...如果你想让make 不理那些无法读取的文件,继续执行,你可以include前加一个减号“-”。...是目标所依赖的源文件,只有一个命令“cc -c -g foo.c”(以Tab键开头)。

3.1K20

Linux下开发stm32 ①

1.为什么不是gcc 之前我们花了三篇文章介绍Linux下如何进行C语言编程: Linux C语言编程(上篇) | gcc的使用 Linux C语言编程(中篇) | make的使用 Linux C语言编程...(下篇) | gdb的使用 这是为了给接下来的Linux下嵌入式开发打好基础,尽快熟悉Linux下c编程,但是开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc...4.2.C文件编译 因为main.c没有特殊的东西,只是两个函数,所以简单的编译一下就可以了: 参数 描述 -Wall 允许输出所有警告 arm-none-eabi-gcc -c -mthumb -...mcpu=cortex-m3 -g -Wall -o main.o main.c 5.链接 链接重要的部分有两点:链接文件和传递给链接器的参数。...链接文件固件库给的示例工程中有,在下面这个目录: ?

3.2K31

手把手教你写一个 Makefile 文件

二、明白编译链接过程 在编写Makefile之前,还是要先了解清楚程序编译链接过程,无论是cc++,首先要把源文件编译成中间代码文件Windows下也就是 .obj 文件,Unix/Linux下是...对于后者,通常是你需要告诉编译器头文件的所在位置(头文件应该只是声明,而定义应该放在C/C++文件),只要所有的语法正确,编译器就可以编译出中间目标文件。...链接程序时,链接器会在所有的Object File找寻函数的实现,如果找不到,那就会报链接错误码(Linker Error),VC下,这种错误一般是:Link 2001错误,意思是说,链接器未能找到函数的实现...如果执行make出现如下信息,那就是命令行(makefile的gcc或者rm)前面没有用tab键缩进,不能用空格: b....makefile文件的最后可以看到有个clean,这个clean就是前面所说的标签,它不是一个文件,所以make无法生成它的依赖关系和决定它是否要执行,只能通过显示指定这个目标才可以 ,通过make

1.5K10

Linux makefile 教程 非常详细,且易懂

这个示例来源于GNU的make使用手册,在这个示例,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。...如果你想让make不理那些无法读取的文件继续执行,你可以include前加一个减号“-”。...为什么需要使用这样的步骤?...如,从文件“foo.c”生成目标程序“foo”,按道理,make会编译生成中间文件“foo.o”,然后链接成“foo”,但在实际情况下,这一动作可以被一条“cc”的命令完成(cc –o foo foo.c...如果目标的后缀是make不能识别的,那么” 当你希望只对更新过的依赖文件进行操作时,”$?”显式规则很有用,例如,假设有一个函数库文件叫”lib”,其由其它几个object文件更新。

4.2K20
领券