当前位置: 首页 > article >正文

gcc和g++的区别以及明明函数有定义为何链接找不到

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        g++和gcc似乎没什么区别,比如“gcc -v”和“g++ -v”的输出是完全一样的,用来编译好像也没什么区别,都能编译.c和.cpp,但是分别编译.c和.cpp却又不能链接,怎么回事呢?

目录

g++会把.c当成C++代码

gcc无法链接C++的.o

明明函数有定义为何链接找不到


g++会把.c当成C++代码

        这意味着对.c编译出来的.o并不是C的,而是C++的(符号名称做了扩展)。

        对于.cpp,两个命令并无区别,都是当作C++。

        如果代码只是自己用,全部用g++就可以了,如果考虑共享,最好C还是C,C格式C和C++都能用,C++格式只能C++用。

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来编译。


(这里是文档结束)


http://www.kler.cn/a/527617.html

相关文章:

  • 【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互
  • UE5 特效
  • 拦截器快速入门及详解
  • Pandas进行MongoDB数据库CRUD
  • Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException
  • < OS 有关 > Android 手机 SSH 客户端 app: connectBot
  • 计算机网络——流量控制
  • CSS 溢出内容处理:从基础到实战
  • 解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路
  • [EAI-029] RoboVLMs,基于VLM构建VLA模型的消融研究
  • Ubuntu 系统,如何使用双Titan V跑AI
  • Learning Vue 读书笔记 Chapter 3
  • 每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析
  • 扩展无限可能:Obsidian Web Viewer插件解析
  • buuuctf_秘密文件
  • 亚博microros小车-原生ubuntu支持系列:18 Cartographer建图
  • 衡水市城区小区地图)矢量高清cdr|pdf大图内容测评
  • Leetcode:541
  • pytorch基于FastText实现词嵌入
  • java求职学习day23
  • 指针(C语言)从0到1掌握指针〕带你探究计算机神奇的秘密
  • autogen 自定义agent (1)
  • 基于排队理论的物联网发布/订阅通信系统建模与优化
  • 第二讲:类与对象(上)
  • deepseek大模型本机部署
  • OSCP:常见文件传输方法