g没有libstdc – 可以做吗? – 一个非常可配置的轻量级libstdc,我可以很容易地拿出东西也会做的伎俩

在这里尝试一些诡异的东西.我正在尝试编写C程序,用GNU g编译,但不依赖libstdc :),但似乎我需要甚至最基本的东西需要它.

具有可配置功能集的libstdc将是可以接受的.

我使用的命令是

g++ -nodefaultlibs -fno-rtti -fno-exceptions -lc

没有libstdc,我得到:

undefined reference to `operator delete(void*)'  
undefined reference to `operator new(unsigned int)'  
undefined reference to `vtable for __cxxabiv1::__class_type_info'  
undefined reference to `vtable for __cxxabiv1::__si_class_type_info'  
undefined reference to `__cxa_pure_virtual'

这些不是在libc中,还有一个很轻的libstdc只能实现这些东西?

我想要这样构建的测试代码目前看起来像这样:

#include <stdio.h>

template <class T>
class X
{
    public:
    T a;
};

class A1
{
    public:
        virtual void f() = 0;
        virtual ~A1() {}
};

class A2 : public A1
{
    public:
        virtual void f() {};
        virtual ~A2() {}
};

class Y
{
    public:
        ~Y() {}
};

int main()
{
    X<int> A;
    X<float> B;
    Y *C = new Y;

    A.a = 12;
    B.a = 2.3;

    printf("A: %d; B: %f\n",A.a,B.a);

    A2 *a2 = new A2;
    a2->f();

    return 0;
}

解决方法

是的,像运算符new和operator delete这样的东西确实在C中定义,而不是在C中定义,所以在C的运行时库中,它们与C的运行时库相反,这是相当荒谬的(与用于C的“pure virtual”相同)明确地诊断对虚拟方法错误调用,等等).如果您链接整个可执行文件,而不需要动态库访问,则链接器应该(希望依赖于C运行库编码的模块化),并选择您在代码中使用的标准C库的最低部分(和您使用的C特定功能越少,例如对于析构函数调用的新隐含删除,等等 – 当然,更有可能避免拉大图书馆块的空间;-).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...