【问题标题】:Any difference in linking with gcc vs. g++?与 gcc 与 g++ 链接有什么区别?
【发布时间】:2011-07-18 15:23:59
【问题描述】:

gcc和g++的链接过程有什么不同吗?

我有一个大型 C 项目,我刚刚将部分代码切换到 C++。该代码尚未使用标准 C++ 库,因此目前不需要 -llibstdc++

【问题讨论】:

  • 我认为 gcc 和 g++ 都只会调用链接器(在我的系统上称为 ld ),所以没有区别。区别在于由 C 编译器或 C++ 编译器生成的目标文件。
  • @JohanLundberg 大声笑,你读过这些问题吗?
  • @Let_Me_Be 呵呵,那我想我明白/没明白链接 process 的意思。 g++ 只是在添加 -llibstdc++ 时调用 gcc,我认为从其他问题中可以清楚地看到这一点。
  • @JohanLundberg 不真实。请参阅接受和回答以及附加的 cmets。

标签: c++ c gcc linker


【解决方案1】:

主要区别在于(假设文件被检测为 C++)g++ 设置了与 C++ 标准库链接所需的标志。它还可以设置异常处理。我不会相信仅仅因为您的应用程序不使用标准库而编译为 C++ 时不需要它(例如默认异常处理程序)。

编辑:正如 cmets 中所指出的,对于静态对象以及没有获取虚函数表的任何构造函数(确实有效)都会遇到问题(因此,如果您使用 C++ 的这些功能,您仍然需要链接那个图书馆)。

EDIT2:除非您在 C 项目中使用 C99 特定代码,否则我实际上只是切换到将整个代码编译为 C++ 作为迁移过程的第一步。

【讨论】:

  • 不要忘记使用构造函数和析构函数初始化static 和全局对象;它们的魔力在于仅在 C++ 模式下链接的启动例程。
  • 嗯,当我有 main.creal_code.cpp 这样的东西时应该怎么做? gcc -c main.cg++ -c real_code.cppg++ real_code.o main.o?
  • 能否请您澄清一下“它也可能设置异常处理。”而且,明确地说,您的意思是 gcc -llibstdc++ 与 g++ 不同吗?我的 g++ 手册页只是说 g++ 是一个调用 GCC 并将 .c、.h 和 .i 文件视为 C ++ 源文件而不是 C 源文件的程序,除非使用了 -x,并自动指定针对C++ 库。.
  • 对多态性的支持肯定是 G++ 添加的,而不是 GCC C 链接器。 C 链接器可以链接不包含虚拟方法的简单 C++ 代码,但您需要 G++ 来支持虚拟方法(以及异常,也许还有其他东西)。我在尝试为 PSoC 微控制器编译 C++ 时发现了这一点,请参阅此页面 mbedded.ninja/programming/microcontrollers/psoc/…
【解决方案2】:

gccg++ 都只是驱动程序,除了调用其他程序之外什么都不做,所以你可以使用-v 选项来查看它们的确切作用——它们调用的其他程序是什么什么参数。因此,对于您碰巧安装的 gcc 的特定版本和体系结构,您可以确切地看到与 gccg++ 链接之间的区别。但是,如果您想要便携性,则不能依赖于保持不变。

根据您的工作,您可能还对-### 参数感兴趣

【讨论】:

    【解决方案3】:

    我认为 g++ 链接器会查找 CPP 损坏的函数名称,它与 C 的不同。我不确定 gcc 能否应对。 (前提是您可以显式使用 C 版本而不是 C++ 版本)。

    编辑:

    如果你有它应该可以工作

    extern "C" {
    <declarations of stuff that uses C linkage>
    }
    

    在您的代码中,目标文件已使用g++ -c 编译。但我不会赌这个。

    【讨论】:

    • 对不起,你不知道你在说什么。
    猜你喜欢
    • 2010-09-15
    • 2010-10-14
    • 2011-08-16
    • 2017-07-16
    相关资源
    最近更新 更多