gcc,g++,extern “C” :一些编译错误的缘由

简介: 正好是我们代码中遇到的问题,之前不求甚解,只用g++编译没有错误就不管了,现在要跨平台到windows下就遇到了问题。全文转载自:http://user.qzone.qq.com/75172588/blog/1248167335 gcc和g++的区别1、gcc在编译阶段,把后缀为.c的源文件按照c语法和方式进行编译;把后缀为.cpp的源文件,按照c++语法和方式进行编译。

正好是我们代码中遇到的问题,之前不求甚解,只用g++编译没有错误就不管了,现在要跨平台到windows下就遇到了问题。
全文转载自:http://user.qzone.qq.com/75172588/blog/1248167335

gcc和g++的区别
1、gcc
在编译阶段,把后缀为.c的源文件按照c语法和方式进行编译;把后缀为.cpp的源文件,按照c++语法和方式进行编译。
在链接阶段,不自动和C++程序使用的库链接。所以,.cpp如果有c++的代码,可能会产生链接错误;.c不存在这个问题,因为如果.c如果有c++的代码,编译时就会不通过。
2、g++
在编译阶段,无论是.c还是.cpp,都按照c++的语法和方式进行编译。其实,g++是调用gcc进行编译。
在链接阶段,会自动和C++程序使用的库链接,即便是纯c程序,也会链接这些库。

为什么需要extern “C”?
在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说,C++和C对产生的函数名字的处理是不一样的。所以,在gcc和g++下编译,会有如下效果:
gcc编译.c文件,因为是按照c方式编译,所以函数名不变;
gcc编译.cpp文件,g++编译.c文件,g++编译.cpp文件,因为是按照c++方式编译,所以函数名加上了附加信息。

在被编译的c++程序中,如果调用了其他的库的函数,则这个函数名也是照加了附加信息的函数名来调的,这样,如果这个库是c方式编译的,那么在库中的函数名是不带附加信息的,这样的调用链接就会失败,因为函数名不对应导致找不到。

在这样的场景下,就需要引入extern “C”。
extern “C”是告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
一般的用法是,比如,现在我们有了一个C库文件,它的头文件是f.h,产生的lib文件是f.lib,那么我们如果要在C++中使用这个库文件,我们需要这样写:

另外,被调函数的实现如果包在extern “C”中,意味着强制按c方式来编译,具体如下:
gcc编译.c文件,会编译不通过,因为c语法中没有extern “C”,实际上在这种情况下根本不需要把函数实现包在extern “C”中,因为这种情况下本来就是按c方式来编译的。因此通常会把代码写成这样:

__cplusplus宏标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义的。
gcc编译.cpp文件,g++编译.c文件,g++编译.cpp文件,函数名不变,即采用c的方式。

为什么要把被调函数的实现包在extern “C”里呢?我想是为了使c程序也能调用它,否则就没有什么必要了。

后记:cl编译器的规则与gcc相同。

目录
相关文章
|
8月前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
367 23
深入理解GCC 和 G++ 编译器
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
11月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
331 11
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
107 4
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
338 0
|
C语言
gcc的简易用法(编译、参数与链接)
【5月更文挑战第14天】gcc的简易用法(编译、参数与链接)。
126 1
|
Unix Java 编译器
安装gcc
【5月更文挑战第14天】安装gcc。
383 1
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
303 0
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
480 0
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令