也许这个答案有点太晚了,但是......
不用 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++,以便您的代码可以找到替换消息并删除。