首页
学习
活动
专区
工具
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编译器不会进行这些处理。

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

相关·内容

通过ffi在node.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的指针类型进行操作。

6K70

通过ffi在node.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的指针类型进行操作。

6.5K10
  • 通过ffi在Node.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的指针类型进行操作。

    6.3K02

    Makefile教程

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

    4.1K53

    换个角度说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 总结 本文主要介绍了两部分内容。

    76220

    深入了解Linux —— make和makefile自动化构建工具

    什么是make/makefile 在之前写代码的过程中,我们都是对一个文件进行编译链接(gcc编译),但是如果一个项目中,源代码文件非常的多,我们总不能一个一个的进行编译链接,这也太麻烦了;所以现在就来学习...目标文件和依赖文件,其实就是两个有着依赖关系的文件(依赖文件可以有多个),如上图就表示code依赖code.c文件 而依赖关系就表明了,如何由依赖文件列表生成目标文件。...创建变量 在makefile中也可以创建变量,和C语言中指针那样 BIN=code SRC=cpde.c OBJ=code.o CC=gcc RM=rm -f $(BIN):$(OBJ) gcc...$^:在依赖方法中使用,指依赖关系中的依赖文件 $@:在依赖方法中使用,指依赖关系在的目标文件 所有就可以这样来写: BIN=code SRC=cpde.c OBJ=code.o CC=gcc...这样我们在写由.c生成.o文件时,就能直接使用通配符%,这样就可以自动匹配 在匹配结束之后,目标文件依赖多个文件;就不能使用$^直接取依赖文件列表了,而是使用%文件列表中多个文件一个一个执行

    25710

    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中定义的只执行命令的目标与工作目录下的实际文件出现名字冲突。...而Makefile中clean目标没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令。所以rm命令不会被执行。

    3.6K10

    深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践

    文件依赖:main.o 依赖 main.c,而 utils.o 依赖 utils.c。每个 .o 文件都通过相应的 gcc 命令编译。 清理目标:clean 是一个伪目标,用于清理生成的文件。...PHONY 告诉 make,即使存在与这些目标名称相同的文件,也不要将其视为文件,而是直接执行相应命令。 为什么使用 .PHONY .PHONY 可以避免文件名和目标名冲突的问题。...而加上 .PHONY 后,make 会忽略同名文件,直接执行伪目标。...使用 % 的模式规则 以下是模式规则的典型结构: %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ 解释 %.o: %.c 表示所有 .o 文件都可以通过对应的 .c 文件生成...) -c $< -o $@ # 链接 program: main.o utils.o $(CC) $(CFLAGS) -o program main.o utils.o clean: rm -f

    59950

    跟我一起写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前加一个减号“-”。

    1.1K70

    跟我一起写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前加一个减号“-”。

    99820

    程序员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中去执行。

    3.1K30

    操作系统(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

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

    1.4K20

    跟我一起写 Makefile(一)

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

    28510

    跟我一起写 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来说很容易

    23430

    CC++之makefile写法

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

    97720

    全网最牛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.3K20

    【Linux】Linux开发工具-vim 编译器-gccg++ 调试器-gdb git操作 项目自动化构建工具-makeMakefile

    其后缀名一般为“.a” 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。...3.4 g++ gcc不能用来编译c++代码,我们创建一个test.cc,.cc表示是c++代码,但是用gcc编译会报错 所以我们就可以用g++来编译c++文件 g++的选项和gcc的选项一模一样,所以也可以带上选项...使用c++11标准 gcc不能编译c++代码,但是g++可以编译c语言代码 g++也可以加-o选项,编译成指定的可执行程序 c++的文件后缀 c++的文件后缀有三种:.cc .cpp .cxx (...-c test.s -o test.o gcc -c 将test.s文件转成test.o文件,.o表示.obj,在vs中我们编译文件就会产生.obj文件 产生的.obj文件叫做目标文件,这个目标文件不能直接执行...链接的过程是我们的程序和库结合的过程 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf

    10210

    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.4K31
    领券