初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
g++和gcc似乎没什么区别,比如“gcc -v”和“g++ -v”的输出是完全一样的,用来编译好像也没什么区别,都能编译.c和.cpp,但是分别编译.c和.cpp却又不能链接,怎么回事呢?
目录
g++会把.c当成C++代码
gcc%E6%97%A0%E6%B3%95%E9%93%BE%E6%8E%A5C%2B%2B%E7%9A%84.o-toc" style="margin-left:0px">gcc无法链接C++的.o
明明函数有定义为何链接找不到
g++会把.c当成C++代码
这意味着对.c编译出来的.o并不是C的,而是C++的(符号名称做了扩展)。
对于.cpp,两个命令并无区别,都是当作C++。
如果代码只是自己用,全部用g++就可以了,如果考虑共享,最好C还是C,C格式C和C++都能用,C++格式只能C++用。
gcc%E6%97%A0%E6%B3%95%E9%93%BE%E6%8E%A5C%2B%2B%E7%9A%84.o">gcc无法链接C++的.o
所以只能用g++来链接(除非所有模块都是C的)。
明明函数有定义为何链接找不到
一般就是因为搞错了代码实际是当作C还是C++来编译的,以C++方式编译的符号名会带上类型和参数信息。以C++方式编译的C文件和由C++包含的C的头文件会发生这种诡异的问题。
为了解决这个问题,C的头文件一般(但不是全部)会提前考虑:
#ifdef __cplusplus
extern "C"
{
#endif
//。。。。。。 将被编译为C格式的声明
#ifdef __cplusplus
}
#endif
这样当头文件被C++代码使用的时候,会按照C规则处理相关符号。
如果C的头文件没有这样做,C++那边也可以很简单地处理,将include放在extern"C"里面即可:
extern "C"
{
#include "C的未处理__cplusplus的头文件"
}
__cplusplus是一个标准的预定义的宏,用来表示正在按照C++而不是C来编译。
(这里是文档结束)