gpt4 book ai didi

c++ - 没有 libstdc++ 的 g++ - 可以做到吗? - 一个非常可配置的轻量级 libstdc++,我可以在其中轻松取出东西也可以解决问题

转载 作者:可可西里 更新时间:2023-11-01 15:20:47 26 4
gpt4 key购买 nike

我正在尝试一些诡异的东西。我正在尝试编写 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;
}

最佳答案

也许这个答案有点太晚了,但是......

在没有 libstdc++ 的情况下编写 C++ 程序很容易。我做了几十年。只是避免与 libstdc++ 链接。这很简单:要么使用 gcc 而不是 g++ 进行链接,要么提供一个只有 new、del 和其他一些函数的假 libstdc++。

这是一个示例,说明如何使用围绕 malloc 的透明包装器替换基本的 libstdc++ 功能:

#include <stdlib.h>

// MSVC uses __cdecl calling convention for new/delete :-O
#ifdef _MSC_VER
# define NEWDEL_CALL __cdecl
#else
# define NEWDEL_CALL
#endif

extern "C" void __cxa_pure_virtual ()
{
abort ();
}

void * NEWDEL_CALL operator new (size_t size)
{
return malloc (size);
}

void * NEWDEL_CALL operator new [] (size_t size)
{
return malloc (size);
}

void NEWDEL_CALL operator delete (void *p)
{
if (p) free (p);
}

void NEWDEL_CALL operator delete [] (void *p)
{
if (p) free (p);
}

void NEWDEL_CALL operator delete (void *p, size_t)
{
if (p) free (p);
}

现在将其放入名为 libstd--.cpp 的文件中,并构建您自己的 libstdc++.a:

gcc -c -O libstdc--.cpp
ar crs libstdc++.a libstdc--.o

然后你可以尝试一个简单的测试:

class A
{
int *x;

public:
A () { x = new int [10]; }
~A () { delete [] x; }
};

int main ()
{
A a;
return 0;
}

编译并查看链接的内容:

g++ -g test.cpp -o test -L.

# ldd ./test
linux-vdso.so.1 (0x00007ffed0b8d000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4d18df0000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f4d18bd9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4d18823000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4d1913b000)

嘿,看,妈妈,没有 libstdc++!

作为替代方案,您可以通过使用 gcc 而不是 g++ 进行链接并在链接器命令行上提供 libstdc--.o 来避免使用伪造的 libstdc++,以便您的代码可以找到替换消息和删除。

关于c++ - 没有 libstdc++ 的 g++ - 可以做到吗? - 一个非常可配置的轻量级 libstdc++,我可以在其中轻松取出东西也可以解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com