.C和.CPP后缀文件的编译区别
2012-12-22 17:05
351 查看
1.gcc认为.c的为C程序,.cpp的为C++程序;
2.g++认为.c的为C++程序,.cpp的为C++程序;
3.VC++的编译器cl认为.c的为C程序,.cpp的为C++程序;
4.C程序与C++程序中同样的函数在编译后的obj文件中的symbol是不同的,所以以C方式编译的obj文件与以C++方式
编译的obj文件无法成功链接。
使个demo说明一下:
准备工作:
为gcc、g++、cl(VC++编译器)、link(VC++链接器)设置好环境变量
//demo.cpp
#include <stdio.h>
#include "foo.h"
int main()
{
printHello();
return 0;
}
//foo.h
void printHello();
//foo.c
#include <stdio.h>
void printHello()
{
printf("Hello MM");
}
1.gcc、g++测试,在windows的cmd下:
D:\>g++ demo.cpp -o demo.obj -c (以C++方式编译生成demo.obj文件,-c选项表示只编译不链接)
D:\>gcc foo.c -o foo.obj -c (以C方式编译生成foo.obj文件)
D:\>g++ demo.obj foo.obj -o demo (链接demo.obj、foo.obj文件)
demo.obj(.text+0x2b):demo.cpp: undefined reference to `printHello()'
collect2: ld returned 1 exit status
提示说找不到printHello,因为按照C++的编译方式去找printHello应该对应某一种格式的symbol,但是我们
的foo.obj中printHello的symbol是另外一种格式的,所以找不到了。
把foo.c改成foo.cpp就可以成功链接了。
2.cl、link测试,在windows的cmd下:
D:\>cl demo.cpp /c (以C++方式编译生成demo.obj文件,/c选项表示只编译不链接)
D:\>cl foo.c /c (以C方式编译生成foo.obj文件)
D:\>link demo.obj foo.obj
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
demo.obj : error LNK2001: unresolved external symbol "void __cdecl printHello(vo
id)"(?printHello@@YAXXZ)
demo.exe : fatal error LNK1120: 1 unresolved externals
理由同上,把foo.c改成foo.cpp就可以成功链接了。
参考文章:
1.gcc和g++的区别(开源CEO)
http://www.linuxdiyf.com/bbs/viewthread.php?tid=109684
2.在 console mode 中使用 C/C++ 编译器(jjhou候俊杰)
http://jjhou.csdn.net/article99-10.htm
2.g++认为.c的为C++程序,.cpp的为C++程序;
3.VC++的编译器cl认为.c的为C程序,.cpp的为C++程序;
4.C程序与C++程序中同样的函数在编译后的obj文件中的symbol是不同的,所以以C方式编译的obj文件与以C++方式
编译的obj文件无法成功链接。
使个demo说明一下:
准备工作:
为gcc、g++、cl(VC++编译器)、link(VC++链接器)设置好环境变量
//demo.cpp
#include <stdio.h>
#include "foo.h"
int main()
{
printHello();
return 0;
}
//foo.h
void printHello();
//foo.c
#include <stdio.h>
void printHello()
{
printf("Hello MM");
}
1.gcc、g++测试,在windows的cmd下:
D:\>g++ demo.cpp -o demo.obj -c (以C++方式编译生成demo.obj文件,-c选项表示只编译不链接)
D:\>gcc foo.c -o foo.obj -c (以C方式编译生成foo.obj文件)
D:\>g++ demo.obj foo.obj -o demo (链接demo.obj、foo.obj文件)
demo.obj(.text+0x2b):demo.cpp: undefined reference to `printHello()'
collect2: ld returned 1 exit status
提示说找不到printHello,因为按照C++的编译方式去找printHello应该对应某一种格式的symbol,但是我们
的foo.obj中printHello的symbol是另外一种格式的,所以找不到了。
把foo.c改成foo.cpp就可以成功链接了。
2.cl、link测试,在windows的cmd下:
D:\>cl demo.cpp /c (以C++方式编译生成demo.obj文件,/c选项表示只编译不链接)
D:\>cl foo.c /c (以C方式编译生成foo.obj文件)
D:\>link demo.obj foo.obj
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
demo.obj : error LNK2001: unresolved external symbol "void __cdecl printHello(vo
id)"(?printHello@@YAXXZ)
demo.exe : fatal error LNK1120: 1 unresolved externals
理由同上,把foo.c改成foo.cpp就可以成功链接了。
参考文章:
1.gcc和g++的区别(开源CEO)
http://www.linuxdiyf.com/bbs/viewthread.php?tid=109684
2.在 console mode 中使用 C/C++ 编译器(jjhou候俊杰)
http://jjhou.csdn.net/article99-10.htm
相关文章推荐
- C与CPP后缀的文件在编译时的区别
- 【转】C与CPP后缀的文件在编译时的区别
- .c和.cpp文件的区别
- c++源文件 不同后缀(.cc .cpp .C .cp)的区别
- (原).cc 和 .cpp 后缀结尾的文件的区别
- .h和.cpp文件的区别
- #pragma once与#ifndef两种防止头文件二次编译的区别
- ros_fuerte创建工作空间、创建ROS功能包、编译ROS功能包、创建节点(cpp)、编译节点、使用launch文件、创建srv和msg文件、使用新建的srv和msg文件
- 包含cpp文件链接opencv源码编译以及neon加速的Android.mk
- 在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件
- VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())
- gcc编译cpp文件为什么要加-lstdc++
- 只有obj或其它文件,但没有cpp,如何才能编译出exe文件zz
- vc++生成的Debug,cpp,html,ncb,opt,dsp,dsw文件是干什么的,有什么区别?
- 关于scanf与scanf_s的区别,以及用scanf编译出错并且提示找不到可执行文件.exe的解决办法。
- error C1128:字节数超过对象文件格式main.cpp限制:请使用/bigobj进行编译
- C#和C/C++编译生成的exe文件的区别
- .c/.cpp文件windows命令行下编译,运行.c/.cpp文件
- 后缀为 ashx 与 axd 的文件有什么区别
- linux 系统下编译cpp文件